转载

JVM参数学习

本文记录的JVM参数以java8为主。

JVM 默认参数

安装Java环境后,查看系统默认的JVM参数,通过cmd命令:java -XX:+PrintFlagsFinal

file

file

file

信息很多,从中我们可以找到我们经常设置的信息(本机物理内存是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

file

可以看出我的收集器默认为:-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为相同的值。

文章参考:倾慕已久

正文到此结束