注:Remembered Sets(RSets)是每一个region里面帮助G1 GC追踪外部指向这个region的引用。因此现在,取代因为引用指向这个region扫描整个heap区,G1只需要扫描RSets。
HopSpot 提供的几种运行模式:
模式
选项指定
描述说明
备注
解释模式
-Xint
让JVM以解释模式运行Java程序
无
编译模式
-Xcomp
让JVM以编译模式运行Java程序
无
混合模式
-Xmixed
让JVM以解释+编译模式运行Java程序。默认方式
无
================ Java8 JVM 可选项================
可选项
默认值
解释说明
备注
-XX:MetaspaceSize
metaspace 初始容量.Metaspace 区域为 Java 1.8 新增,去 1.7 永久代的替代参数。并不是所有的永久代数据都放置在metaspace 区域,只有类消息是放置在metaspace, 其他信息都在堆上
-XX:MaxMetaspaceSize
metaspace 区的最大容量
-XX:G1NewSizePercent
8
G1 的Young 区是通过算法自动适应确定的。Young区GC的耗时来确定之后的Young大小,如果耗时过长,则调小Young区,耗时过短,则调大Young区.
-XX:G1RSetUpdatingPauseTimePercent
G1 收集器进行GC的时候,更新 RSet 的目标时间值;注:为了让评估暂停阶段把大量的时间花费在拷贝存活对象上。如果改变了花费在更新RSet上的时间,那就必须有确定工作线程可以在回收暂停阶段完成它们的工作;如果不能,那这部分工作就会被放到 Refinement 线程里面去执行,导致并行工作量增加,并行回收次数增多。
-XX:G1MixedGCCountTarget
当占用内存超过InitiatingHeapOccupancyPercent阀值时, 最多通过多少次Mixed GC来将内存控制在阀值之下.
-XX:G1HeapRegionSize
表示G1 垃圾收集器将每个Region切分成多大;每个 Region最大不超过 32M(2 的指数),
-XX:+G1SummarizeRSetStats
统计RSet 的密度数量(细粒度或者粗粒度),这个密度帮助决定是否并行 Refinement线程有能力去应对更新缓存的工作,并且手机更多关于 Nmethods的信息。这个选项每隔 n 次 GC 暂停收集一次 RSet 的统计信息, 这个 N 次 由选项 -XX:G1SummarizeRSetStatsPeriod=n 决定,也是需要通过选项进行设置的。
-XX:G1SummarizeRSetStatsPeriod=n
n
-XX:G1NewSizePercent
5%
初始化年轻代占用整个堆内存的百分比
-XX:G1MaxNewSizePercent
60%
年轻代的上升空间,即最大可以占用堆内存的百分比。
-XX:StringTableSize
-XX:+PrintStringTableStatistics
打印 StringTable 的统计信息
-XX:+NoOmitFramePointer
-XX:+PreserveFramePointer
-XX:+PrintStringTableStatistics
在JVM进程退出时,打印出StringTable的统计信息到标准日志输出目录中。
-XX:+UseCMSCompactAtFullCollection
默认是开启的;开启内存碎片的合并整理过程
-XX:CMSFullGCsBeforeCompaction
设置执行多少次不压缩的FULL GC后,紧接着执行一次碎片整理
-XX:+CMSParallelRemarkEnabled
启用并发标记
-XX:+CMSScavengeBeforeRemark
如果 remark 时间过长,开启该选项可以强制 remark 之前开启一次 minor gc , 以减少 remark 暂停时间。但是在 remark 之后立即开始一次 minor gc.
-XX:MaxGCPauseMills
设置垃圾收集器,最大停顿时间
-XX:GCTimeRatio
设置吞吐量的大小。可选值为 1 -- 100 之间,假设 GCTimeRatio 的值为 n,那么系统将花费不超过 1/(1+n) 的时间用于垃圾收集。
-XX:InitiatingHeapOccupancyPercent
当占用内存超过这个百分比的时候, G1 垃圾收集器开始执行多次Mixed GC来整理老年代内存碎片.
-XX:PrintFlagsWithComments
-XX:PrintVMOptions
-XX:PrintFlagsInitial
-XX:ManagementServer
可选项
默认值
解释说明
-XX:+ExplicitGCInvokesConcurrent
None
指定System.gc()采用 CMS 算法,FGC时停机时间会变短,但是CMS GC次数不会变。
-XX:-UseBiasedLocking
启用
关闭偏向锁
-XX:+PerfDisableSharedMem
启用
是否允许写统计文件。由于参数里面带有 Disable,关闭的意思就是允许写统计文件,启用的意思就是禁止写统计文件,注意不要把它理解反了;
-Dsun.rmi.dgc.client.gcInterval=36000000
-Dsun.rmi.dgc.server.gcInterval=36000000
rmi默认一小时主动触发一次,这里可以将配置为10小时;
注意:CMS initial-mark 和 CMS remark 都会导致 stop-the-world。 故在 jstat 查看 FGC 参数值时,会出现 +2 的情况。
================OS模块初始化相关的VM配置、调试选项================
可选项
默认值
解释说明
-XX:+UseNUMA
false
使用 NUMA
-XX:+UseLargePages
true
使用大页内存
-XX:+UseSHM
false
使用 SYSV 共享内存
-XX:+MaxFDLimit
true
最大文件描述数量
-XX:+PerfAllowAtExitRegistration
false
允许向系统注册 atexit 函数
-XX:+PrintMicellaneous
false
输出未分类的调试信息(需要开启Verbose)
================ OOP 相关 VM 选项 ================
可选项
默认值
解释说明
-XX:UseCompressedOops
false
在64位 VM 中使用开启压缩OOPS,用32位指针指向类元数据(仅限64位VM)
-XX:CheckCompressedOops
true
对压缩OOPS开启校验
-XX:CompactFields
true
字段压实
-XX:PrintCompactFieldsSavings
false
输出开启CompactFields后,节省了多少字节空间
-XX:FieldsAllocationStyle
1
域分配策略
================ VM 选项:类加载相关 ================
可选项
默认值
解释说明
-XX:TraceClassLoading
false
跟踪所有类加载过程
-XX:TraceClassLoadingPreorder
false
跟踪所有类在载入前的过程
-XX:TraceClassInitialization
false
跟踪类初始化过程
-XX:TraceClassResolution
false
跟着常量池解析过程
-XX:TraceClassUnloading
false
跟踪类卸载过程
-XX:TraceLoaderConstraints
false
跟着加载器约束
-XX:PrintSystemDictionaryAtExit
false
输出系统字典信息
-XX:PrintClassStatistics
false
输出类统计信息
-XX:MustCallLoadClassInternal
false
loadClassInternal() 替代 loadClass()
-XX:LoadLineNumberTables
true
类文件解析器是否加载代码行号表
-XX: LoadLocalVariableTables
true
类文件解析器是否加载局部变量表
-XX:LoadLocalVariableTypeTables
true
类文件解析器是否加载局部变量类型表
-XX:LinkWellKnownClasses
false
解析熟知类
-XX:LazyBootClassLoader
true
是否延迟打开启动类路径
-XX:CompileTheWorldPreloadClasses
true
加载一个类时,是否预加载其用到的所有类
-XX:ClassUnloading
true
类卸载
-XX:AlwaysLockClassLoader
false
要求VM在调用 loadClass()前先获得类加载器锁
-XX:UnsyncloadClass
false
非同步方式调用 loadClass()
================ VM 选项:类验证相关 ================
可选项
默认值
解释说明
-XX:BytecodeVerificationLocal
false
开启对本地类的字节码验证
-XX:BytecodeVerificationRemote
true
开启对远程类的字节码验证
-XX:UseSplitVerifier
true
对 StackMap Table 属性应用 split verifier
-XX:FailOverToDidVerfier
true
当对 StackMapTable属性应用 split verifier 校验失败时,回到旧的 verifier。
================ VM 选项:GC 日志相关 ================
可选项
默认值
解释说明
-XX:PrintGC
false
等同于 "-verbose:gc"
-XX:PrintGCDetail
GC 时输出更多细节信息
-XXPrintGCDateStamps
false
GC操作的日期信息,相对于时间戳,这个是 GST 时间
-XXPrintGCTimeStamps
false
GC 时的时间戳信息
-XX:PrintGCTaskTimeStamps
false
输出每个 GC 工作线程的时间戳信息
-Xloggc:
输出GC 日志至文件
-XX:+UseGCLogFileRotation
启用GC日志文件的自动转储
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-XX:CMSWaitDuration
2s
扫描Old区时间间隔
-XX:CMSInitiatingOccupancyFraction
65
Old区占比超过参数执行 GC 操作
-XX:+UseCMSInitiatingOccupancyOnly
配合上面参数使用,只有 old 区,占比条件满足情况下,才触发CMS GC
-XX:PrintFLSStatistics
打印每次gc前后的Heap余量。较大的余量,可以怀疑Heap中存在内存碎片过多
-XX:+ExplicitGCInvokesConcurrent
将System.gc转为background式的回收
================ VM 选项:GC 安全点相关 ================
可选项
默认值
解释说明
-XX:PrintGCApplicationConcurrentTime
false
默认值false, 应用程序运行时间
-XX:PrintGCApplicationStoppedTime
false
应用程序暂停时间,在以安全点开始的操作中,线程停顿时间
-XX:ShowSafepointMsgs
false
显示关于 安全点的信息
-XX:PrintSafepointStatisticsCount
300
-XX:PrintSafepointStatisticsTimeout
-1
输出关于安全点的统计信息
-XX:+PrintSafepointStatistics
300
应用程序暂停原因
================ VM 选项:CMS 配置选项 ================
可选项
默认值
解释说明
-XX:UseConcMarkSweepGC
false
对老年代使用并发标记-清除(CMS)回收
-XX:CMSIncrementalMode
false
增量模式
-XX:CMSIncrementalPacing
true
增量模式自动调整
-XX:ParallelGCThreads
0
并行执行的GC线程数量
-XX:UseParNewGC
false
对新生代使用并行线程手机,以配合CMS老年代手机。即使不开启该选项,当选择CMS后,新生代默认也会使用ParNew。
【参考资料】
1.[Oracle 官网文档]. http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html