-XX:+UseG1GC |
使用 G1 垃圾收集器 |
-XX:MaxGCPauseMillis=200 |
设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到) |
-XX:InitiatingHeapOccupancyPercent=45 |
启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示”一直执行GC循环”. 默认值为 45. |
-XX:NewRatio=n |
新生代与老生代(new/old generation)的大小比例(Ratio). 默认值为 2. |
-XX:SurvivorRatio=n |
eden/survivor 空间大小的比例(Ratio). 默认值为 8. |
-XX:MaxTenuringThreshold=n |
提升年老代的最大临界值(tenuring threshold). 默认值为 15. |
-XX:ParallelGCThreads=n |
设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同. |
-XX:ConcGCThreads=n |
并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同. |
-XX:G1ReservePercent=n |
设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10. |
-XX:G1HeapRegionSize=n |
使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为1Mb, 最大值为 32Mb. |
-Xmx10M -Xmn10M -XX:+PrintGCTimeStamps -XX:+UseG1GC -XX:+PrintGCDetails -Xloggc:./gclogs
假若通过 -Xmn 显式地指定了年轻代的大小, 则会干扰到 G1收集器的默认行为.
对 survivors 或 promoted objects 进行GC时,如果JVM的heap区不足,就会发生提升失败(promotion failure)。堆内存不能继续扩充,因为已经达到最大值了。当使用 -XX:+PrintGCDetails 时将会在GC日志中显示 to-space overflow (to-空间溢出)。
GC仍继续所以空间必须被释放,拷贝失败的对象必须被放到正确的位置(tenured in place),CSet指向区域中的任何 RSets 更新都必须重新生成(regenerated),所有这些步骤都是代价高昂的
3.3 如何避免转移失败(Evacuation Failure)
要避免避免转移失败, 考虑采纳下列选项:
3种日志详情格式:
2种时间戳格式:
-XX:+PrintGCDetails日志示例:
0.522: [GC pause (young), 0.15877971 secs] // 程序运行0.522秒后发生一个Evacuation Pause,耗时0.15877971秒。
[Parallel Time: 157.1 ms] // 并行GC耗时157.1 ms
[GC Worker Start (ms): 522.1 522.2 522.2 522.2 // 每个工作线程启动时间,时间根据线程id排序
Avg: 522.2, Min: 522.1, Max: 522.2, Diff: 0.1] // 所有工作线程启动时间的平均值、最小值、最大值、差别
[Ext Root Scanning (ms): 1.6 1.5 1.6 1.9 // 每个扫描root的线程耗时
Avg: 1.7, Min: 1.5, Max: 1.9, Diff: 0.4]
[Update RS (ms): 38.7 38.8 50.6 37.3 // 每个执行更新RS(Remembered Sets)的线程的耗时
Avg: 41.3, Min: 37.3, Max: 50.6, Diff: 13.3]
[Processed Buffers : 2 2 3 2 // 每个工作线程执行UB(Update Buffers)的数量
Sum: 9, Avg: 2, Min: 2, Max: 3, Diff: 1]
[Scan RS (ms): 9.9 9.7 0.0 9.7 // 每个工作线程扫描RS的耗时
Avg: 7.3, Min: 0.0, Max: 9.9, Diff: 9.9]
[Object Copy (ms): 106.7 106.8 104.6 107.9 // 每个工作线程执行OC(Object Copy)的耗时
Avg: 106.5, Min: 104.6, Max: 107.9, Diff: 3.3]
[Termination (ms): 0.0 0.0 0.0 0.0 // 每个工作线程执行终止的耗时
Avg: 0.0, Min: 0.0, Max: 0.0, Diff: 0.0]
[Termination Attempts : 1 4 4 6 // 每个工作线程执行终止的重试的次数
Sum: 15, Avg: 3, Min: 1, Max: 6, Diff: 5]
[GC Worker End (ms): 679.1 679.1 679.1 679.1 // 每个工作线程终止时的时间
Avg: 679.1, Min: 679.1, Max: 679.1, Diff: 0.1]
[GC Worker (ms): 156.9 157.0 156.9 156.9 // 每个工作线程的生命时间
Avg: 156.9, Min: 156.9, Max: 157.0, Diff: 0.1]
[GC Worker Other (ms): 0.3 0.3 0.3 0.3 // 每个工作线程执行其他任务(上述未统计的内容)的耗时
Avg: 0.3, Min: 0.3, Max: 0.3, Diff: 0.0]
[Clear CT: 0.1 ms] // 清理CT(Card Table)的耗时
[Other: 1.5 ms] // 其他任务(上述未统计的内容)的耗时
[Choose CSet: 0.0 ms] //选择分区的耗时
[Ref Proc: 0.3 ms] // 执行关联(Reference objects)的耗时
[Ref Enq: 0.0 ms] // 将references放入ReferenceQueues的耗时
[Free CSet: 0.3 ms] // 释放CS(collection set)的耗时
[Eden: 12M(12M)->0B(10M) Survivors: 0B->2048K Heap: 13M(64M)->9739K(64M)] // Eden容量为12M,使用了12M,GC后变为0,容量目标大小增加到13M。
// SurvivorsGC前为0,GC后变为2048K
// GC前,Heap容量为64M,使用13M;GC后,Heap容量为64M,使用9739k。
[Times: user=0.59 sys=0.02, real=0.16 secs]