young gc的耗时主要有两个方面
- 从root对象进行扫描存活的对象
- 复制存活的对象
从缩短扫描存活对象的方面入手:首先我们先考虑root对象包含哪些
1、所有java线程以及线程栈帧里指向GC堆里的对象的引用
2、JNI Local & Global
3、由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的
4、stack local Java方法的local变量或参数
5、其他,包含monitor & finalizable & native stack 等吧
- 只要减少GC roots集合大小以及降低每次gc 之后的存活对象就可以了;减少GC root集合主要是减少线程数
- 调整Eden区域大小对应用产生的可能影响,扩充年轻代大小,这样不会因为Survivor区小而被迫进入老年代
-
减少对象生成 以到达降低young gc 次数;线程池或者对象池复用的技术
2020-05-08T17:46:39.163+0800: 5.916: [GC pause (G1 Evacuation Pause) (young), 0.0187382 secs]
[Parallel Time: 17.8 ms, GC Workers: 8]
[GC Worker Start (ms): Min: 5916.0, Avg: 5921.5, Max: 5926.9, Diff: 10.9]
[Ext Root Scanning (ms): Min: 0.0, Avg: 0.7, Max: 1.9, Diff: 1.9, Sum: 5.3]
[Update RS (ms): Min: 0.0, Avg: 1.3, Max: 3.3, Diff: 3.3, Sum: 10.8]
[Processed Buffers: Min: 0, Avg: 3.1, Max: 10, Diff: 10, Sum: 25]
[Scan RS (ms): Min: 0.0, Avg: 0.4, Max: 1.0, Diff: 1.0, Sum: 3.0]
[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.2, Diff: 0.2, Sum: 0.3]
[Object Copy (ms): Min: 0.5, Avg: 5.2, Max: 12.8, Diff: 12.2, Sum: 41.4]
[Termination (ms): Min: 0.0, Avg: 4.7, Max: 6.3, Diff: 6.3, Sum: 37.3]
[Termination Attempts: Min: 1, Avg: 1.6, Max: 3, Diff: 2, Sum: 13]
[GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
[GC Worker Total (ms): Min: 6.8, Avg: 12.3, Max: 17.7, Diff: 10.9, Sum: 98.2]
[GC Worker End (ms): Min: 5933.7, Avg: 5933.7, Max: 5933.8, Diff: 0.0]
[Code Root Fixup: 0.1 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.1 ms]
[Other: 0.7 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 0.4 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.1 ms]
[Humongous Register: 0.0 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 0.1 ms]
[Eden: 50.0M(50.0M)->0.0B(46.0M) Survivors: 8192.0K->8192.0K Heap: 81.9M(100.0M)->35.3M(100.0M)]
[Times: user=0.12 sys=0.00, real=0.02 secs]