JVM 默认参数查看
1、安装完Java环境后,我们可以通过下面这个命令查看系统默认的jvm参数
运行cmd
命令:java -XX:+PrintFlagsFinal
我们可以看到默认jvm的主要参数如下:
从上面的信息,我们可以找到我们经常设置的信息(本机物理内存是8G):
-Xmx:最大堆内存(默认为物理内存的1/4),图上对应可以看出 MaxHeapSize=2109734912(约2G,即为物理内存的1/4)
-XX: MaxMetaspaceSize: 这个是jdk1.8新的参数,用来代替以前的MaxPermSize(持久代大小),
-XX: MaxNewSize: 最大新生带大小 ,图上可以看出最大的 MaxNewSize=703070208(约700M)
-XX: NewSize: 初始的年轻代大小,图上可以看出最大的 NewSize=44040192(约40M)
-XX: NewRation: 表示年轻代与年老代所占比值为,图上可以看出2,即就是年轻代与年老代为1/2,也就是年轻代为堆内存的1/3,用最大内存2g来看,最大年轻代为700M,和上面的信息也是对应一致的
-XX: SurvivorRatio:标识Eden区与Survivor区的大小比值,默认值8,由于Survivor是由两个大小相同的区域组成,那么即就是两个Survivor与Eden的比值为2:8,也就是一个Survivor区占整个年轻代的1/10,Eden区占整个新生代的8/10
对于一般的生产环境而言,默认的JVM参数基本就可以了,如果需要调整可以根据自身的环境进行调整,比如我自己的本地环境的jvm参数:
-Xms2G -Xmx2G -Xmn256m -Xss256k
因为我是java web项目,且请求次数多,但是请求体不大,因此考虑将新生代的内存设置的小一点,保证请求能够在结束后,如果需要GC,最好直接在年轻代GC,不要过渡到老年代,从而引发FullGC(但是参数一定要自己试一试,不要频发的引发yong gc)
GC日志查看分析
由于gc收集器的不一样,因此打印出来的日志也不一样,下面我以自己本地默认的收集器为例,看一看一个FullGC的日志信息
查看本地默认的收集器:
使用cmd 输入:java -XX:+PrintCommandLineFlags -version
可以看出我的收集器默认为:-XX:+UseParallelGC:即为并行收集器
[Full GC (Ergonomics) [PSYoungGen: 14841K->13410K(227840K)] [ParOldGen: 20967K->21980K(38400K)] 35809K->35390K(266240K), [Metaspace: 5155K->5155K(1056768K)], 0.0281768 secs] [Times: user=0.19 sys=0.02, real=0.03 secs]
其中 PSYoungGen 表示发生GC时,yong的内存由占用14841K回收到占用13410K 括号后的227840K 表示总的年轻代内存大小
ParOldGen 表示发生GC的时候老年代内存的释放情况
35809K->35390K(266240K), 这个数值表示的发生GC的时候,整个堆内存的变换情况
而最主要的是Ergonomics这个GC的情况,具体原因可以参考https://blog.csdn.net/weixin_43194122/article/details/91526740
很多人可能发现了我的PSYoungGen和ParOldGen的内存,差别比较大,主要原因是本次调试过程中我没有设置-Xms参数,而是由系统自动分配的,这样也会导致每次GC后,内存的重新分配,因此建议在生产环境中设置-Xms和-Xmx为相同的值。
好了,本次简单的了解就到这里,如果你有什么好的意见或建议,欢迎交流学习!