JVM--堆内存调优

堆参数

常用参数:

    -Xms --jvm堆的最小值
    -Xmx --jvm堆的最大值
    -XX:MaxNewSize  --新生代最大值
    -XX:MaxPermSize=1028m  --永久代最大值
    -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
    -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800-XX:+PrintGCDetails  --打印出GC的详细信息
    -verbose:gc --开启gc日志
    -Xloggc:d:/gc.log -- gc日志的存放位置
    -Xmn -- 新生代内存区域的大小
    -XX:SurvivorRatio=8 --新生代内存区域中Eden和Survivor的比例

Java7:
在这里插入图片描述

Java8:

JDK1.8之后将最初的永久代取消了,由元空间取代。

在这里插入图片描述

元空间与永久代最大的区别在于:

永久代使用的JVM的堆内存,但是Java8以后的元空间并不在虚拟机中而是使用本机物理内存。

因为,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入native memory,字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制,而由系统的实际可用空间来控制。

堆内存调优

在这里插入图片描述

package pers.zhang;

public class test {

    public static void main(String[] args) {

        //返回java虚拟机试图使用的最大内存量
        long maxMemory = Runtime.getRuntime().maxMemory();

        //返回Java虚拟机中的内存总量
        long totalMemory = Runtime.getRuntime().totalMemory();

        System.out.println("MAX_MEMORY=" + maxMemory + "(字节。)" + (maxMemory / (double)1024 / 1024 + "MB"));

        System.out.println("TOTAL_MEMORY=" + totalMemory + "(字节。)"  + (maxMemory / (double)1024 / 1024 + "MB"));

    }
}

发现默认的情况下分配的内存是总内存的『1/4』、而初始化的内存为『1/64』

在这里插入图片描述

在这里插入图片描述

java7输出:在这里插入图片描述

java8输出:
在这里插入图片描述

OOM异常

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

发布了667 篇原创文章 · 获赞 1894 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/cold___play/article/details/104077023