Java VM 启动参数详解
@Date 2017.05.24
打印输出相关参数-verbose打印加载类的详细信息-verbose:gc打印虚拟机中GC的详细情况:显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs/java.hprof虚拟机在出现内存溢出异常时Dump 出当前的内存堆转储快照-XX:+TraceClassLoading打印加载类的详细信息-XX:+PrintGCDetails详细了解GC中的变化-XX:+PrintGCDateStamps了解垃圾收集发生的时间,自JVM启动以后以秒计量-Xloggc:/home/admin/logs/gc.logGC日志文件的路径
涉及堆相关的参数-serverserver模式下,新生代选择的是并行GC,旧生代选择的是并行GC
client模式下,新生代选择的是串行GC,旧生代选择的是串行GC-Xms2g堆的初始值2g-Xmx2g堆的最大值2g
PS:避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样-XX:MinHeapFreeRation=空余堆内存小于MinHeapFreeRation时,JVM会增大Heap到-Xmx指定的大小-XX:MaxHeapFreeRation=空余堆内存大于MaxHeapFreeRation时,JVM会减小heap的大小到-Xms指定的大小-Xmn1g新生代堆大小1G-XX:SurvivorRatio=8默认32:1:1
新生代的Eden区:From区:To区的比例为8:1:1-XX:PermSize= (JDK7)永久代大小-XX:MaxPermSize= (JDK7)永久代MAX大小-XX:MetaspaceSize= (JDK8)代替PermSize,元空间大小-XX:MaxMetaspaceSize= (JDK8)代替MaxPermSize,元空间最大值
回收算法标记-清理直接清理
效率高
产生内存碎片标记-复制两块内存区域,S1,S2
不存在内存碎片
占用双倍空间标记-整理在标记-清理之后,让剩余存活的对象都向一端移动,并更新引用其对象的指针
效率低
不产生碎片分代收集算法把Java堆分新生代和老年代
在新生代用复制算法
在老年代用标记-清理或标记-整理算法
垃圾清理类型-XX:+UseSerialGCSerial GC
串行
使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收,即Minor GC和Major GC
适用于CPU配置较低,内存占用较少的单独Client应用模式-XX:+UseParallelGCParallel GC
并行
收集方式同Serial GC一样
产生N个线程来进行年轻代的垃圾收集
N默认=系统CPU核数-XX:ParallelGCThreads=设置Parallel GC线程数量-XX:+UseParallelOldGCParallel Old GC
方式同Parallel GC
主要是年轻代和年老代垃圾回收时都使用多线程收集-XX:+UseConcMarkSweepGC并发标记清除(CMS)收集器
短暂停顿并发收集器CMS-initial-mark:初始标记阶段(stop the world)
CMS-concurrent-mark : 和应用线程并发执行,标记可达的对象
CMS-concurrent-preclean(CMS-concurrent-preclean-start,CMS-concurrent-preclean) : 预清理(标记和应用线程是并发执行的,有些对象的状态在标记后会改变)
CMS-concurrent-abortable-preclean : 进一步的预清理,减少Rescan阶段时间.使用到参数(-XX:CMSMaxAbortablePrecleanTime)
Rescan阶段(stop the world) : 暂停应用线程,对对象进行重新扫描并标记
CMS-concurrent-sweep : 并发的垃圾清理
CMS-concurrent-reset : 下一次CMS GC重置相关数据结构
对年老代进行垃圾收集
年轻代使用的算法和Parallel一样
适用于不能忍受长时间停顿要求快速响应的应用
!!!FULL GCconcurrent-mode-failure : CMS GC时,有新的对象要进入年老代,但是年老代空间不足
promotion-failed : Young GC时,存活对象从Eden区到Survivor区,但是Survivor区空间不足,需要到年老代,年老代空间也不足
作者:voltric
链接:https://www.jianshu.com/p/674c3614ff34