基本参数
参数 | 值 | 说明 |
---|
-server | | 启动 Server模式(64位 JVM默认开启) |
-Xms | 4096m | 设置初始堆大小(不包含永久代/元空间), 等价于 -XX:InitialHeapSize . -Xms 的默认值为物理内存大小的1/64 |
-Xmx | 4096m | 设置最大堆大小(不包含永久代/元空间), 等价于 -XX:MaxHeapSize . -Xmx 的默认值为物理内存大小的1/4. 建议设置与 -Xms 相同的值,其目的是为了垃圾回收后, 不再需要重新分隔计算堆区的大小, 以此提高性能 |
-Xss | 512k | 设置每个线程栈大小, 此参将会直接关系到每个进程能开启的线程数和递归调用的深度, 默认值为1m |
-Xmn | 1408m | 设置年轻代大小, 等价于 -XX:NewSize 和 -XX:MaxNewSize , 此参一般使用默认值, 因为与选项 -XX:NewRatio 相互矛盾, 当然如果设置了优先级高于 -XX:NewRatio |
-XX:PermSize | 64m | 设置内存持久代区初始大小, jdk1.8开始此参已过时 |
-XX:MaxPermSize | 64m | 设置内存持久代区最大大小, jdk1.8开始此参已过时 |
-XX:NewRatio | 2 | 设置年轻代(Eden区+Survivor区)与老年代的比例, 如设置3, 则年轻代1(1/4), 老年代3(3/4), 默认值为2 |
-XX:SurvivorRatio | 8 | 设置年轻代中 Eden区与 Survivor(from/to)区的比例, 如设置6, eden:from:to = 6:1:1, 默认值为8, 不过实际内部分配是6(由于有自适应机制 -XX:-UseAdaptiveSizePolicy , 不过此参即使关了也同样无法撤销), 所以如需8的占比, 则需要显式的指明8 |
-XX:+UseTLAB | | 是否开启(默认开启) |
-XX:TLABWasteTargetPercent | 1 | 设置 TLAB空间所占用 Eden空间的百分比大小(默认只有1%) |
-XX:+DoEscapeAnalysis | | 显式开启逃逸分析(JDK7开始默认开启), JVM启动模式必须为 server, 才可以启用逃逸分析 |
-XX:+EliminateLocks | | 开启同步消除 |
-XX:+EliminateAllocations | | 开启标量替换(默认开启), 允许将对象打散分配在栈上 |
-XX:+PrintEscapeAnalysis | | 查看逃逸分析的筛选结果 |
-XX:+PrintEliminateAllocations | | 查看标量替换详情 |
-XX:InitialTenuringThreshold | 7 | 设置对象在年轻代中存活的次数初始值, 该参数在首次 Minor GC时用于判断对象是否需要移动到老年代, 默认值为7 |
-XX:MaxTenuringThreshold | 15 | 设置对象在年轻代中存活的次数最大值, 如设置为0, 则年轻代对象不经过 Survivor区, 而直接进入老年代, 默认值为15 |
-XX:TargetSurvivorRatio | 80 | 表示 Minor GC结束后 Survivor区中占用空间的期望比例, 当存放的对象超过这个数值, 则对象会被移动到老年代, 默认值为50, 即 Survivor(from/to)区的对象目标使用率为50% |
-XX:+PrintTenuringDistribution | | 每次 Minor GC之后打印 Survivor空间中对象的年龄分布 |
-XX:+PrintGC | | 打印简要 GC信息, GC前的堆栈信息和 GC后的堆栈大小和堆栈的总大小 |
-XX:+PrintGCDetails | | 按不同参数, 如不同收集器打印的日志不同 |
-XX:+PrintFlagsInitial | | 查看所有参数的默认初始值 |
-XX:+PrintFlagsFinal | | 查看所有参数的最终值(输出已改过的最终值) |
-XX:+PrintGCTimeStamps | | 打印当前行垃圾收集的时间秒 |
-XX:+DisableExplicitGC | | 忽略 System.gc() |
-XX:StringTableSize | 60013 | Jdk6中 StringTable默认的 bucket数量是1009, 但 Jdk7开始该默认值被改为60013. 还有 Jdk8开始可以设的最小值为1009 |
-XX:+PrintStringTableStatistics | | 打印 StringTable的统计信息(默认未开启) |
-XX:+UseStringDeduplication | | 开启 String去重(默认未启用) |
-XX:+PrintStringDeduplicationStatistics | | 打印去重统计信息 |
-XX:StringDeduplicationAgeThreshold | 3 | 字符串对象经过3次 GC后, 如果还存活着, 就会成为去重的候选对象(默认3次) |
-Xint | | 只采用解释器模式执行程序 |
-Xcomp | | 只采用编译器模式执行程序, 如果即时编译出了问题, 解释器会介入执行 |
-Xmixed | | 采用解释器和即时编译器的混合模式共同执行程序(默认) |
-XX:CompileThreshold | 10000 | 方法被调用次数或循环体回边累计次数, 以此达到被即时编译器编译的条件. (client模式下默认调用次数为 1500, server模式下默认调用次数为 10000) |
-XX:CounterHalfLifeTime | 300 | 当开启了热度衰减-XX:+UseCounterDecay (默认开启)时, 被调用的次数不是绝对次数, 而是指定时间段的执行频率, 如果超过了指定的时间段, 同时被调用次数仍不足以让它提交给即时编译器编译, 此时方法的调用次数会被消减一半. 这段时间称之为半衰周期, 可通过此参调整半衰周期, 单位为秒(此参貌似只能在调试时可用) |
-XX:-UseCounterDecay | | 关闭热度衰减(默认开启), 被调用的次数就成为绝对次数, 这样只要系统运行足够长, 绝大部分的热点代码都会被编译成本地代码并缓存 |
-XX:+TieredCompilation | | 分层编译策略: 解释执行时不开启性能监控, 则会触发 C1编译. 如果开启了, C2编译器会根据性能监控信息进行激进优化. Jdk7开始服务端模式会默认开启分层编译策略 |
-Xloggc | :D:/logs/gc.log | 日志信息记录到指定文件 |
-XX:+HeapDumpOnOutOfMemoryError | | 当堆空间溢出时导出内存快照, 参数指定导出目录: -XX:HeapDumpPath=/Users/quanchunlin/Desktop , 导出的 hprof文件通过 MAT(Memory Analyzer Tool)工具分析溢出原因 |
Serial垃圾收集器相关参数
参数 | 值 | 说明 |
---|
-XX:+UseSerialGC | | 设置串行收集器, 默认同时开启 Serial Old老年代收集器 |
Parallel垃圾收集器相关参数
参数 | 值 | 说明 |
---|
-XX:+UseParallelGC | | 设置并行收集器, 吞吐量优先时用此收集器, 仅对年轻代有效, 不能与 CMS收集器配合工作 |
-XX:+UseParallelOldGC | | 设置并行老年代收集器 |
-XX:ParallelGCThreads | 8 | 设置并行收集器的线程数, 默认与 CPU的核数是相同的, 建议设置小于核数, 不建议设大于核数. 当核数大于8个 ParallelGCThreads=3 + (5 * cpu core / 8) |
-XX:MaxGCPauseMillis | 200 | 设置期望达到的最大 GC停顿时间. 默认值为200ms |
-XX:GCTimeRatio | 99 | 设置垃圾回收时间占总时间的比率(吞吐量), 取值范围是大于0, 且小于100的整数, 默认值为99, 也就是允许最大1%(即1 / ( 1 + 99))的垃圾收集时间. 此参与 -XX:MaxGCPauseMillis 有一定矛盾性 |
-XX:+UseAdaptiveSizePolicy | | 设置动态调整年轻代(Eden区+Survivor区)的比例, 计算依据是 GC过程中统计的 GC时间, 吞吐量, 内存占用量, 此参数适用与并行收集器, 在 CMS并发收集器时默认关闭 |
ParNew& CMS垃圾收集器相关参数
参数 | 值 | 说明 |
---|
-XX:+UseParNewGC | | 设置并发串行收集器, 响应时间优先时用此收集器, 仅对年轻代有效, 能与 CMS并发收集器配合工作 |
-XX:+UseConcMarkSweepGC | | 设置老年代 CMS并发收集器 |
-XX:ParallelGCThreads | 8 | 设置收集器的线程数, 默认与 CPU的核数是相同的, 建议设置小于核数, 不建议设大于核数. 当核数大于8个 ParallelGCThreads=3 + (5 * cpu core / 8) |
-XX:ParallelCMSThreads | 2 | 设置 CMS并发收集器的线程数, 默认启动的线程数是(ParallelGCThreads + 3) / 4 = 2; ParallelGCThreads是新年代 ParNew并行收集器的线程数 |
XX:CMSInitiatingOccupanyFraction | 20 | Jdk6之前默认值为68%, 之后92%. 一旦到达该阈值即触发回收 |
-XX:+UseCMSCompactAtFullCollection | | 在配置了 CMS并发收集器时, 对老年代的压缩, 此参会使垃圾收集停顿时间变长, jdk1.8开始此参已过时 |
-XX:CMSFullGCsBeforeCompaction | 5 | 在上面配置开启的前提下, 在此参设置多少次 Full GC后, 对老年代进行压缩, jdk1.8开始此参已过时 |
-XX:+CMSParallelRemarkEnabled | | 设置尽量降低标记停顿 |
-XX:+CMSScavengeBeforeRemark | | 开启 CMS重新标记阶段之前, 尝试清除 young GC来有效降低 remark时间, 注: 即使开启也并不会保证在标记阶段前一定会进行清除操作 |
-XX:+CMSPermGenSweepingEnabled | | 设置永久代进行垃圾回收, 为了避免持久代(Perm Gen)区满引起的 Full GC, JDK 1.5建议开启 |
-XX:+CMSClassUnloadingEnabled | | 设置永久代进行垃圾回收, 为了避免持久代(Perm Gen)区满引起的 Full GC, JDK 1.6~建议开启 |
-XX:CMSInitiatingOccupancyFraction | 70 | 设置 CMS作为垃圾回收使用 70%后开始收集 |
-XX:+UseCMSInitiatingOccupancyOnly | | 在上面配置开启的前提下, 设置此参, 如不设置此参, JVM只会在第一次按设定的70% GC, 后续则自动调整 |
G1垃圾收集器相关参数
参数 | 值 | 说明 |
---|
-XX:+UseG1GC | | 显式指定 G1垃圾收集器 |
-XX:G1HeapRegionSize | | 设置每个 Region的大小, 大小范围是1~32MB之间, 就是2的幂, 即1MB, 2MB … 16MB, 32MB. 目标是根据最小的 Java堆大小划分出约2048个区域. 默认为堆内存的1/2000 |
-XX:MaxGCPauseMillis | 200 | 设置期望达到的最大 GC停顿时间. 默认值为200ms |
-XX:ParallelGCThreads | 8 | 设置收集器的线程数, 默认与 CPU的核数是相同的, 建议设置小于核数, 不建议设大于核数. 当核数大于8个 ParallelGCThreads=3 + (5 * cpu core / 8) |
-XX:ConcGCThreads | | 设置并发标记的线程数. 将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右 |
-XX:InitiatingHeapOccupancyPercent | 45 | 设置触发 GC的堆占比, 默认值为 45% |
-XX:G1MixedGCCountTarget | 8 | 混合垃圾回收的目标次数, 默认值为8 |
-XX:G1MixedGCLiveThresholdPercent | 65 | 指定垃圾占内存分段比率, 一旦到此比率就会被回收, 默认值为65% |
-XX:G1HeapWastePercent | 10 | 设置允许浪费的堆占比, 如果未达到此阈值, 则不进行混合回收, 默认值为10% |
设置堆大小, 各种堆使用比列和线程堆栈大小
- 注: 32位系统和 Jdk5.0或以下版本有堆大小限制
- 年轻代设置过小时
- Minor GC次数过于频繁, 因此消耗大量系统资源
- 大对象直接进入老年代, 占据大量老年代的空间, 导致老年代的 Major GC/Full GC频率上升
- 年轻代设置过大时
- 年轻代过于大, 可能会导致老年代过于太小, 导致老年代的 Major GC/Full GC频率上升
- Minor GC耗时大幅度增加, 一般年轻代占整个堆的1/3比较合适
- Survivor区设置过小
- 会导致对象从 Eden直接到达老年代, 降低了对象在年轻代的存活时间, 导致老年代的 Major GC/Full GC频率上升
- Survivor区设置过大
- 会导致 Eden过小, 增加了 Minor GC频率
* 通过 -XX:MaxTenuringThreshold来控制年轻代存活时间, 尽量让对象在年轻代被回收
> java -Xms4096m -Xmx4096m -Xss512k -Xmn1408m -XX:NewRatio=2 -XX:SurvivorRatio=8
> C:\Program Files\Java\jdk1.8.0_121\bin>jmap -heap 17388
Attaching to process ID 17388, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 1476395008 (1408.0MB)
MaxNewSize = 1476395008 (1408.0MB)
OldSize = 2818572288 (2688.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 1107296256 (1056.0MB)
used = 638743664 (609.1534271240234MB)
free = 468552592 (446.84657287597656MB)
57.68498362916888% used
From Space:
capacity = 184549376 (176.0MB)
used = 29029488 (27.684677124023438MB)
free = 155519888 (148.31532287597656MB)
15.729930184104226% used
To Space:
capacity = 184549376 (176.0MB)
used = 0 (0.0MB)
free = 184549376 (176.0MB)
0.0% used
PS Old Generation
capacity = 2818572288 (2688.0MB)
used = 40623056 (38.74116516113281MB)
free = 2777949232 (2649.258834838867MB)
1.441263584863572% used
29331 interned Strings occupying 3545216 bytes.
设置回收器
- JVM支持三种回收器: 串行收集器, 并行收集器, 并发收集器 其中串行收集器只适用于小数据量, 目前主要用的收集器为并行和并发收集器
吞吐量优先时
- 选择
-XX:+UseParallelGC
并行收集器 - 年轻代尽可能设大些, 因为对响应时间没有要求, 垃圾收集可以并行进行
- 设置很大的年轻代和一个较小的老年代, 让对象尽可能呆年轻代长一点, 减少因年轻代空间不足进入老年代的对象, 从而存老年代存放的尽是长期存活对象
> java -Xms1024m -Xmx1024m -Xss1m -Xmn256m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseParallelGC -XX:ParallelGCThreads=2 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy -XX:+PrintTenuringDistribution -XX:InitialTenuringThreshold=7 -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails
[GC (Allocation Failure)
Desired survivor size 26738688 bytes, new threshold 7 (max 15)
[PSYoungGen: 209920K->8904K(236032K)] 209920K->8920K(1022464K), 0.0139137 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
[GC (Allocation Failure)
Desired survivor size 26738688 bytes, new threshold 7 (max 15)
[PSYoungGen: 218824K->13516K(236032K)] 218840K->13604K(1022464K), 0.0155481 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[GC (Metadata GC Threshold)
Desired survivor size 26738688 bytes, new threshold 7 (max 15)
[PSYoungGen: 16890K->7879K(236032K)] 16978K->7967K(1022464K), 0.0097382 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Metadata GC Threshold) [PSYoungGen: 7879K->0K(236032K)] [ParOldGen: 88K->7876K(786432K)] 7967K->7876K(1022464K), [Metaspace: 20757K->20757K(1067008K)], 0.0509364 secs] [Times: user=0.06 sys=0.01, real=0.05 secs]
[GC (Allocation Failure)
Desired survivor size 26738688 bytes, new threshold 7 (max 15)
[PSYoungGen: 209920K->10039K(236032K)] 217796K->17923K(1022464K), 0.0090786 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure)
Desired survivor size 15204352 bytes, new threshold 6 (max 15)
[PSYoungGen: 219959K->12352K(236032K)] 227843K->20244K(1022464K), 0.0154359 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[GC (Allocation Failure)
Desired survivor size 17301504 bytes, new threshold 5 (max 15)
[PSYoungGen: 222272K->14822K(243200K)] 230164K->23919K(1029632K), 0.0218318 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[GC (Allocation Failure)
Desired survivor size 20447232 bytes, new threshold 4 (max 15)
[PSYoungGen: 243174K->16883K(245248K)] 252271K->27437K(1031680K), 0.0235152 secs] [Times: user=0.06 sys=0.00, real=0.02 secs]
[GC (Metadata GC Threshold)
Desired survivor size 20447232 bytes, new threshold 3 (max 15)
[PSYoungGen: 99329K->14334K(239104K)] 109884K->28850K(1025536K), 0.0208969 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
[Full GC (Metadata GC Threshold) [PSYoungGen: 14334K->0K(239104K)] [ParOldGen: 14515K->24871K(786432K)] 28850K->24871K(1025536K), [Metaspace: 34711K->34711K(1079296K)], 0.1276143 secs] [Times: user=0.22 sys=0.00, real=0.13 secs]
[GC (Allocation Failure)
Desired survivor size 20447232 bytes, new threshold 2 (max 15)
[PSYoungGen: 222208K->8470K(242176K)] 247079K->33349K(1028608K), 0.0094479 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure)
Desired survivor size 19922944 bytes, new threshold 1 (max 15)
[PSYoungGen: 230678K->10952K(242688K)] 255557K->35839K(1029120K), 0.0143171 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
[GC (Allocation Failure)
Desired survivor size 19922944 bytes, new threshold 1 (max 15)
[PSYoungGen: 233672K->6599K(242176K)] 258559K->41714K(1028608K), 0.0218689 secs] [Times: user=0.06 sys=0.00, real=0.02 secs]
[GC (Allocation Failure)
Desired survivor size 20447232 bytes, new threshold 1 (max 15)
[PSYoungGen: 229319K->5088K(241664K)] 264434K->45417K(1028096K), 0.0130370 secs] [Times: user=0.02 sys=0.01, real=0.01 secs]
[GC (Allocation Failure)
Desired survivor size 20447232 bytes, new threshold 1 (max 15)
[PSYoungGen: 227296K->4781K(242176K)] 267625K->48626K(1028608K), 0.0128892 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
[GC (Allocation Failure)
Desired survivor size 20447232 bytes, new threshold 1 (max 15)
[PSYoungGen: 226989K->4421K(242176K)] 270834K->51126K(1028608K), 0.0112366 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
[GC (Allocation Failure)
Desired survivor size 20447232 bytes, new threshold 1 (max 15)
[PSYoungGen: 226629K->4620K(242176K)] 273334K->54033K(1028608K), 0.0311580 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
- GC (Allocation Failure)表示 Minor GC, 其中 ParNew: 226750K->23046K(235968K)表示年轻代 GC前已使用空间为226750K, GC后已使用空间为23046K, 年轻代总空间为235968K. 紧随其后的263699K->59995K(1022400K)表示 GC前整个堆的已使用空间为263699K, GC后已使用空间为59995K, 堆的总空间为1022400K
响应时间优先时
- 选择 CMS并发收集器
- 年轻代尽可能设适当的大, 由于堆大了需要较长 GC时间
- 老年代使用并发收集器
CMS
- CMS(Concurrent Low Pause Collector), 是 jdk1.4后期版本开始引入的新 gc算法, 在 jdk5和 jdk6中得到了进一步改进, 它的主要适合场景是对响应时间的重要性需求大于对吞吐量的要求
CMS收集周期
- 初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) -> 并发重置状态等待下次 CMS的触发(CMS-concurrent-reset)
- 其中 CMS-initial-mark和 CMS-remark是会暂停所有的应用程序线程的, 然后名称中包含 concurrent的过程是会并发地运行
CMS参数使用说明
- 垃圾回收先择 CMS并发收集器开启参数:
-XX:+UseConcMarkSweepGC
- 设定 CMS回收线程数目通过参数:
-XX:ParallelCMSThreads=n
调整 - 为了防止堆碎片引起 Full GC, 开启 CMS阶段进行合并碎片参数:
-XX:+UseCMSCompactAtFullCollection
, 不过此参会使垃圾收集停顿时间变长, 因此需再通过参数: -XX:CMSFullGCsBeforeCompaction=n
配置适当频次调整性能, jdk1.8开始此两参数已过时 - 为了减少暂停的时间, 开启并行 remark参数:
-XX:+CMSParallelRemarkEnabled
. 如果 remark还是过长可以再开启参数: -XX:+CMSScavengeBeforeRemark
, CMS重新标记阶段之前, 尝试清除 young GC, 但是 remark后又会立即进行一次 Minor GC. - 为了避免持久代(Perm Gen)区满引起的 Full GC, 设置永久代进行垃圾回收, jdk版本1.5开启参数:
-XX:+CMSPermGenSweepingEnabled
或 jdk版本1.6或以上开启参数: -XX:+CMSClassUnloadingEnabled
- 默认 CMS是在老年代(Tenured Generation)沾满68%的时候开始进行 CMS收集, 如果你的老年代增长不是那么快, 且希望降低 CMS频次, 可以适当调高此参数:
-XX:CMSInitiatingOccupancyFraction=n
> java -Xms1024m -Xmx1024m -Xss1m -Xmn256m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=10 -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintTenuringDistribution -XX:InitialTenuringThreshold=7 -XX:MaxTenuringThreshold=15 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
3.937: [GC (Allocation Failure) 3.937: [ParNew
Desired survivor size 13402112 bytes, new threshold 15 (max 15)
- age 1: 8524208 bytes, 8524208 total
: 209792K->8369K(235968K), 0.0113644 secs] 209792K->8369K(1022400K), 0.0114286 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
5.272: [GC (Allocation Failure) 5.272: [ParNew
Desired survivor size 13402112 bytes, new threshold 15 (max 15)
- age 1: 9204024 bytes, 9204024 total
- age 2: 4085880 bytes, 13289904 total
: 218161K->14562K(235968K), 0.0179900 secs] 218161K->14562K(1022400K), 0.0180348 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
6.521: [GC (Allocation Failure) 6.521: [ParNew
Desired survivor size 13402112 bytes, new threshold 3 (max 15)
- age 1: 9805040 bytes, 9805040 total
- age 2: 3481176 bytes, 13286216 total
- age 3: 4075312 bytes, 17361528 total
: 224354K->20923K(235968K), 0.0204933 secs] 224354K->20923K(1022400K), 0.0205472 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
6.544: [GC (CMS Initial Mark) [1 CMS-initial-mark: 0K(786432K)] 20924K(1022400K), 0.0047161 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
6.548: [CMS-concurrent-mark-start]
6.549: [CMS-concurrent-mark: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
6.549: [CMS-concurrent-preclean-start]
6.551: [CMS-concurrent-preclean: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
6.551: [CMS-concurrent-abortable-preclean-start]
7.169: [CMS-concurrent-abortable-preclean: 0.440/0.618 secs] [Times: user=1.05 sys=0.13, real=0.62 secs]
7.169: [GC (CMS Final Remark) [YG occupancy: 130964 K (235968 K)]7.169: [GC (CMS Final Remark) 7.169: [ParNew
Desired survivor size 13402112 bytes, new threshold 15 (max 15)
- age 1: 4611288 bytes, 4611288 total
- age 2: 3927312 bytes, 8538600 total
- age 3: 3188752 bytes, 11727352 total
: 130964K->15306K(235968K), 0.0296249 secs] 130964K->19725K(1022400K), 0.0296603 secs] [Times: user=0.08 sys=0.02, real=0.03 secs]
7.199: [Rescan (parallel) , 0.0057013 secs]7.204: [weak refs processing, 0.0000311 secs]7.205: [class unloading, 0.0025726 secs]7.207: [scrub symbol table, 0.0068768 secs]7.214: [scrub string table, 0.0005787 secs][1 CMS-remark: 4418K(786432K)] 19725K(1022400K), 0.0465941 secs] [Times: user=0.09 sys=0.02, real=0.05 secs]
7.216: [CMS-concurrent-sweep-start]
7.222: [CMS-concurrent-sweep: 0.003/0.006 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
7.222: [CMS-concurrent-reset-start]
7.229: [CMS-concurrent-reset: 0.007/0.007 secs] [Times: user=0.02 sys=0.01, real=0.01 secs]
日志记录执行过程解释
[GC (Allocation Failure) [ParNew
: 表示年轻代 GC, 通过 UseParNewGC并发串行收集器收集
: 209792K->8369K(235968K), 0.0113644 secs]
: 209792K表示年轻代收集前的大小, 8369K表示收集后的大小, (235968K)表示当前总容量大小, 表示收集年轻代所花费的时间, 单位秒
209792K->8369K(1022400K), 0.0114286 secs]
: 表示当前对的收集前大小, 收集后大小和容量总大小及收集花费的时间
[Times: user=0.06 sys=0.00, real=0.01 secs]
: 表示用户耗时, 系统耗时, 真实耗时
- 3.937, 5.272, 6.521 三次年轻代分配失败(Allocation Failure), 对象直接进入老年代
- 6.544: [GC (CMS Initial Mark) 老年代 CMS初始标记
- 6.548: [CMS-concurrent-mark-start] 开始并发标记
- 6.549: [CMS-concurrent-preclean-start] 开始进行预清理
- 7.169: [GC (CMS Final Remark) 重新标记
- 7.216: [CMS-concurrent-sweep-start] 开始并发清理
- 7.222: [CMS-concurrent-reset-start] 开始并发重置状态
- 其中 CMS-initial-mark阶段暂停线程0.0047161秒, CMS-concurrent-mark阶段暂停线程0.0465941秒, 因此两次暂停花费总时间是0.0513102秒少于200毫秒可以认为是正常范围
两种引起 Full GC的情况, Full GC时, 会暂停整个应用
- 日志信息 promotion failed
- 年轻代空间不足, 从而把对象转移到老年代, 但是老年代也空间不足, 因此导致 Full GC.
- 13.649: [ParNew (promotion failed): 3107K->2674K(29504K), 0.0028597 secs] 35047K->35013K(62272K), 0.0029042 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- 解决方法是简单讲就是把老年代或年轻代其中一个设大一些, 例 首先适当调年轻代和老年代比列后通过参数:
-XX:SurvivorRatio
调整空间比, 把 Survivor区设大些, 让对象尽量在 Survivor区呆长一点, 减少因年轻代空间不足进入老年代的对象, 减少老年代暴涨的可能性, 参数: -XX:SurvivorRatio
默认值是8可以设置更小比如4, 如 设2的话是 Survivor区空间是 Eden区空间的的一半
- 日志信息 concurrent mode failure
- 当正在进行 CMS收集时, 有对象从年轻代进入老年代, 但是老年代空间不足引起的
16.622: [CMS-concurrent-sweep-start]
16.622: [Full GC (GCLocker Initiated GC) 16.622: [CMS16.632: [CMS-concurrent-sweep: 0.010/0.010 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
(concurrent mode failure): 32767K->32767K(32768K), 0.1232975 secs] 45351K->38398K(63744K), [Metaspace: 43769K->43769K(1087488K)], 0.1233561 secs] [Times: user=0.11 sys=0.00, real=0.12 secs]
动态调试 JVM参数
- 如正在运行中的 Java程序需要查看 GC日志等情况
1. 首先查出 pid
> C:\Program Files\Java\jdk1.8.0_121\bin>jps
16736 Launcher
17360 RemoteMavenServer
3568 ShopTestApp
4672
16472 Launcher
5640 Launcher
19388 Jps
2. 查看当前已开启的 Java程序的 JVM参数
> C:\Program Files\Java\jdk1.8.0_121\bin>jinfo 3568
...
...
VM Flags:
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=1073741824 -XX:InitialTenuringThreshold=7 -XX:+ManagementServer -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=536870912 -XX:MaxTenuringThreshold=15 -XX:MinHeapDeltaBytes=524288 -XX:NewRatio=2 -XX:NewSize=536870912 -XX:OldSize=536870912 -XX:ParallelGCThreads=2 -XX:+PrintTenuringDistribution -XX:SurvivorRatio=8 -XX:ThreadStackSize=1024 -XX:TieredStopAtLevel=1 -XX:+UseAdaptiveSizePolicy -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC -XX:+UseParallelOldGC
Command line: -Xms1024m -Xmx1024m -Xss1m -Xmn512m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseParallelGC -XX:ParallelGCThreads=2 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy -XX:+PrintTenuringDistribution -XX:InitialTenuringThreshold=7 -XX:MaxTenuringThreshold=15 -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.profiles.active=local -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=63465 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:D:\download\IntelliJ IDEA 2018.1.1\lib\idea_rt.jar=63466:D:\download\IntelliJ IDEA 2018.1.1\bin -Dfile.encoding=UTF-8
3. 动态添加打印参数
- 打印指定 JVM的参数值: jinfo -flag <name> pid
- 设置指定 JVM参数的布尔值: jinfo -flag [+|-]<name> pid
- 设置指定 JVM参数的值: jinfo -flag <name>=<value> pid
> C:\Program Files\Java\jdk1.8.0_121\bin>jinfo -flag +PrintGC 3568
> C:\Program Files\Java\jdk1.8.0_121\bin>jinfo -flag +PrintGCDetails 3568
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!