注:Remembered Sets(RSets)是每个region里面帮助G1 GC追踪外部指向这个region的引用。所以如今,取代由于引用指向这个region扫描整个heap区,G1只须要扫描RSets。html
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的统计信息到标准日志输出目录中。oracle
-XX:+UseCMSCompactAtFullCollection函数
默认是开启的;开启内存碎片的合并整理过程spa
-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:<filename> | 输出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