Hotspot虚拟机参数通用配置
-XX:+UseCMSCompactAtFullCollection
在Full GC时,开启对年老代的压缩.
-XX:CMSFullGCsBeforeCompaction=9
设置CMS GC在n次Full GC后进行内存压缩
-XX:CMSInitiatingOccupancyFraction=80
配置内存占比超过80%进行一次gc
-XX:+CMSParallelRemarkEnabled
降低标记停顿
gc停顿的意思就像是在整个分析期间冻结在某个时间点上,具体的原因是防止在分析的时候,对象引用关系还在不断的变化,如果没有GC停顿很有可能分析不准确。
如何降低:在Serial的老年代垃圾收集器中,会把所有线程的暂停,停下来收集哪些是死亡对象。在CMS和G1中都采取了初始标记、并发标记、短暂GC停顿重新标记,初始标记会直接记录能GC ROOTS 关联的对象,在并发标记的时候有一个线程来标记,这个时候对象的发生的变化都会记录下来,在重新标记的时候会修正,这样就会降低GC停顿时间
-XX:+CMSScavengeBeforeRemark
- CMS GC分为初始标记->并发标记->并发预清理->重新标记->并发清除->并发重置几个步骤,该参数的作用是在Remark前对年轻代进行一次minor gc,以减轻Remark的工作量click me
-XX:+ExplicitGCInvokesConcurrent
打开此参数后,在做System.gc()时会做background模式CMS GC,即并行FULL GC,可提高FULL GC效率
CMS并行fullGC
-XX:-HeapDumpOnOutOfMemoryError
可以让JVM在出现内存溢出时候Dump出当前的内存转储快照
-XX:HeapDumpPath=/data/applogs
DUMP文件的路径
-XX:InitialHeapSize=5361369088
出事堆内存大小
-XX:MaxNewSize=2061500416
最大新生代大小
-XX:MaxTenuringThreshold=9
在新生代中对象存活次数(经过Minor GC的次数)后仍然存活,就会晋升到老年代
-XX:NewSize=2061500416
新生代初始大小
-XX:OldPLABSize=16
老年代空间PLAB大小,对于OldPLAB的解释请参考
Old space PLABs
XX:+PrintGC
输出GC日志
-XX:+PrintGCApplicationConcurrentTime
打印每次垃圾回收前,程序未中断的执行时间
-XX:+PrintGCApplicationStoppedTime
输出GC应用暂停的时间
-XX:+PrintGCDetails
输出详细的GC日志
-XX:+PrintGCTimeStamps
输出gc时间戳
-XX:+PrintGCDetails
输出GC日期格式的时间戳
-XX:+PrintHeapAtGC
HotSpot在GC前后都会将GC堆的概要状况输出
-XX:-ReduceInitialCardMarks
解决gc bug
card-marking performance optimization算法在实现的时候有瑕疵,在某些情况下会引起heap corruption。这个情况主要发生在新创建的大对象
和Eden space大小差不多,然后jvm做young GC的时候。
解决方案:在启动参数中增加-XX:-ReduceInitialCardMarks将性能优化策略关闭。
-XX:+ScavengeBeforeFullGC
在Full gc前进行一次minor dc
-XX:SoftRefLRUPolicyMSPerMB=0
官方解释是:Soft reference在虚拟机中比在客户集中存活的更长一些。其清除频率可以用命令行参数 -XX:SoftRefLRUPolicyMSPerMB=来控制,这可以指定每兆堆空闲空间的 soft reference 保持存活(一旦它不强可达了)的毫秒数,这意味着每兆堆中的空闲空间中的 soft reference 会(在最后一个强引用被回收之后)存活1秒钟。注意,这是一个近似的值,因为 soft reference 只会在垃圾回收时才会被清除,而垃圾回收并不总在发生。系统默认为一秒,我觉得没必要等1秒,客户集中不用就立刻清除,改为 -XX:SoftRefLRUPolicyMSPerMB=0;
-XX:SurvivorRatio=8
SurvivorRation 与 Eden区的比例 8:1
-XX:ThreadStackSize=512
线程堆栈大小
-XX:+UseCMSInitiatingOccupancyOnly
只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整
用-XX+UseCMSInitiatingOccupancyOnly标志来命令JVM不基于运行时收集的数据来启动CMS垃圾收集周期。而是,当该标志被开启时,JVM通过CMSInitiatingOccupancyFraction的值进行每一次CMS收集,而不仅仅是第一次。然而,请记住大多数情况下,JVM比我们自己能作出更好的垃圾收集决策。因此,只有当我们充足的理由(比如测试)并且对应用程序产生的对象的生命周期有深刻的认知时,才应该使用该标志。
-XX:+UseCompressedOops
由于64位JVM消耗的内存会比32位的大1.5倍,因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。好在从JDK 1.6 update14开始,64 bit JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新参数
使用-XX:+UseCompressedOops压缩对象指针
oops指的是普通对象指针(ordinary object pointers)。
Java堆中对象指针会被压缩成32位
-XX:+UseCompressedClassPointers
压缩类指针
对象中指向类元数据的指针会被压缩成32位
类指针压缩空间会有一个基地址
-XX:+UseConcMarkSweepGC
设置年老代为CMS并发收集
-XX:+UseParNewGC
设置年轻代为并行收集
浙公网安备 33010602011771号