JVM-参数

1、打印GC的简要信息:

-verbose:gc
-XX:+printGC

输出:

[GC 4790K->374K(15872K), 0.0001606 secs]
 
[GC 4790K->374K(15872K), 0.0001474 secs]

//GC之前,用了4M左右的内存,GC之后,用了374K内存,一共回收了将近4M。内存大小一共是16M左右。

2、打印GC的详细信息:

-XX:+PrintGCDetails

-XX:+PrintGCTimeStamps  //打印时间戳

3、指定GC log的位置,以文件输出,帮助开发人员分析问题

-Xloggc:log/gc.log

 二、堆的分配参数

JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。

所有线程共享数据区大小=新生代大小 + 年老代大小 + 持久代大小

1、-Xmx –Xms:指定java堆最大值(默认值是物理内存的1/4(<1GB))和初始java堆最小值(默认值是物理内存的1/64(<1GB))

默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
默认空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制

通常会将 -Xms 与 -Xmx两个参数的配置相同的值,其目的是为了在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。

2、设置分代参数

-Xmn-XX:NewRatio:新生代(eden+2*Survivor)和老年代(不包含永久区)的比值

-XX:SurvivorRatio:设置两个Survivor区和eden的比值

-XXNewSize:设置年轻代大小

-XX:MaxNewSize:设置年轻代最大值

3、OOM异常

-XX:+HeapDumpOnOutOfMemoryError:OOM时导出堆到文件,根据这个文件,我们可以看到系统dump时发生了什么

-XX:+HeapDumpPath:导出OOM的路径

-XX:OnOutOfMemoryError:在OOM时,执行一个脚本,可以在OOM时,发送邮件,甚至是重启程序

4、堆的分配参数总结:

  • 根据实际事情调整新生代和幸存代的大小
  • 官方推荐新生代占java堆的3/8
  • 幸存代占新生代的1/10
  • 在OOM时,记得Dump出堆,确保可以排查现场问题

6、永久区分配参数:jvm启动时分配,不能大于最大空间,否则内存溢出

-XX:PermSize:设置永久区的初始空间(物理内存的1/64)

-XX:MaxPermSize: 设置永久区最大空间(物理内存的1/4)

三、栈的分配参数

1、-Xss:设置每个线程栈空间的大小
在相同物理内存下,减小这个值能生成更多的线程。

2、-XXThreadStackSize:设置线程栈的大小

四、JVM其他参数

1、-XXThreadStackSize:设置内存页的大小,不可设置过大,会影响永久代的大小

2、-XX:+UseFastAccessorMethods:设置原始类型的快速优化

3、-XX:+DisableExplicitGC:设置关闭System.gc()

4、-XX:MaxTenuringThreshold    

设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。该参数只有在串行GC时才有效.

5、-XX:+AggressiveOpts:加快编译                 

6、-XX:+UseBiasedLocking:  锁机制的性能改善                 

7、-Xnoclassgc:    禁用垃圾回收                 

8、-XX:SoftRefLRUPolicyMSPerMB :设置每MB堆空闲空间中SoftReference的存活时间,默认值是1s 。

9、-XX:PretenureSizeThreshold:设置对象超过多大时直接在旧生代分配,默认值是0。

10、-XX:TLABWasteTargetPercent: 设置TLAB占eden区的百分比,默认值是1% 。  

11、-XX:+CollectGen0First:     设置FullGC时是否先YGC,默认值是false。

  • YGC :对新生代堆进行gc。频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收。性能耗费较小。
  • FGC :全堆范围的gc。默认堆空间使用到达80%(可调整)的时候会触发fgc。以我们生产环境为例,一般比较少会触发fgc,有时10天或一周左右会有一次。