) 13421K->13218K(18944K), 0.1904231 secs] 2020-06-02T22:30:58.021+0800: 8.949: [Full GC (Ergonomics) ->13569K(18944K), 0.1366324 secs] 2020-06-02T22:30:58.838+0800: 9.766: [Full GC (Ergonomics) 17153K- >13703K(18944K), 0.1436044 secs] 2020-06-02T22:30:59.069+0800: 9.998: [Full GC (Ergonomics) 17287K-> 13837K(18944K), 0.1610447 secs] 2020-06-02T22:30:59.318+0800: 10.246: [Full GC (Ergonomics) 17402K-> 13971K(18944K), 0.1682002 secs] 2020-06-02T22:30:59.592+0800: 10.520: [Full GC (Ergonomics) 17402K->
) 2136K->1992K(3584K), 0.0040658 secs] [Full GC (Ergonomics) 2807K->2791K(3584K), 0.0036280 secs] [ Full GC (Allocation Failure) 2791K->373K(3584K), 0.0032477 secs] [Full GC (Ergonomics) 2786K->2773K Full GC (Ergonomics) 2779K->2770K(3584K), 0.0016329 secs] [Full GC (Ergonomics) 2779K->2775K(3584K) , 0.0023157 secs] [Full GC (Ergonomics) 2775K->2775K(3584K), 0.0015927 secs] [Full GC (Ergonomics) Full GC (Ergonomics) 2802K->2799K(3584K), 0.0031293 secs] [Full GC (Ergonomics) 3023K->3023K(3584K)
] [Full GC (Ergonomics) 15511K->13542K(18432K), 0.1956311 secs] ... [Full GC (Ergonomics) 16382K->16381K(18432K), 0.1734902 secs] [Full GC (Ergonomics) 16383K->16383K( secs] [Full GC (Ergonomics) Exception in thread "main" 16383K->16382K(18432K), 0.1406222 secs] [Full GC (Allocation Failure) 16382K->16382K(18432K), 0.1392928 secs] [Full GC (Ergonomics) 16383K->16382K (18432K), 0.1546243 secs] [Full GC (Ergonomics) 16383K->16382K(18432K), 0.1755271 secs] [Full GC (Ergonomics
另外这里的_adaptive_size_policy 常量就是对应的Ergonomics: case _adaptive_size_policy: return "Ergonomics 那么你也许有疑问说[Full GC (Ergonomics) 的Ergonomics究竟是个什么东东? Ergonomics翻译成中文,一般都是“人体工程学”。 在JVM中的垃圾收集器中的Ergonomics就是负责自动的调解gc暂停时间和吞吐量之间的平衡,然后你的虚拟机性能更好的一种做法。 对于注重吞吐量的收集器来说,在某个generation被过渡使用之前,GC ergonomics就会启动一次GC。 总之,以后遇到Full GC,不一定只有Allocation Failure,还有更多,比如本文中的“Ergonomics”。
] [Full GC (Ergonomics) 15511K->13542K(18432K), 0.1956311 secs] ... [Full GC (Ergonomics) 16382K->16381K(18432K), 0.1734902 secs] [Full GC (Ergonomics) 16383K->16383K( secs] [Full GC (Ergonomics) Exception in thread "main" 16383K->16382K(18432K), 0.1406222 secs] [Full GC (Allocation Failure) 16382K->16382K(18432K), 0.1392928 secs] [Full GC (Ergonomics) 16383K->16382K (18432K), 0.1546243 secs] [Full GC (Ergonomics) 16383K->16382K(18432K), 0.1755271 secs] [Full GC (Ergonomics
] [Full GC (Ergonomics) 15511K->13542K(18432K), 0.1956311 secs] ... [Full GC (Ergonomics) 16382K->16381K(18432K), 0.1734902 secs] [Full GC (Ergonomics) 16383K->16383K( secs] [Full GC (Ergonomics) Exception in thread "main" 16383K->16382K(18432K), 0.1406222 secs] [Full GC (Allocation Failure) 16382K->16382K(18432K), 0.1392928 secs] [Full GC (Ergonomics) 16383K->16382K (18432K), 0.1546243 secs] [Full GC (Ergonomics) 16383K->16382K(18432K), 0.1755271 secs] [Full GC (Ergonomics
] [Full GC (Ergonomics) 15511K->13542K(18432K), 0.1956311 secs] ... [Full GC (Ergonomics) 16382K->16381K(18432K), 0.1734902 secs] [Full GC (Ergonomics) 16383K->16383K( secs] [Full GC (Ergonomics) Exception in thread "main" 16383K->16382K(18432K), 0.1406222 secs] [Full GC (Allocation Failure) 16382K->16382K(18432K), 0.1392928 secs] [Full GC (Ergonomics) 16383K->16382K (18432K), 0.1546243 secs] [Full GC (Ergonomics) 16383K->16382K(18432K), 0.1755271 secs] [Full GC (Ergonomics
secs]2023-11-16T19:04:03.006+0800: 459907.346: [JNI Weak Reference, 0.0000448 secs] 459908.553: [G1Ergonomics allocation request: 0 bytes, threshold: 7730941110 bytes (30.00 %), source: end of GC] 459908.553: [G1Ergonomics 代码解读复制代码2023-11-16T19:03:47.107+0800: 459891.447: Application time: 5.0003976 seconds 459891.490: [G1Ergonomics bytes, threshold: 7660476810 bytes (30.00 %), source: concurrent humongous allocation] 459891.499: [G1Ergonomics seconds2023-11-16T19:03:50.231+0800: 459894.572: Application time: 0.0031969 seconds 459894.583: [G1Ergonomics
Heap Size (Estimated): 239.75M Ergonomics Machine Class: client Using VM: OpenJDK 64-Bit Server Heap Size (Estimated): 348.00M Ergonomics Machine Class: client Using VM: OpenJDK 64-Bit Server Heap Size (Estimated): 193.38M Ergonomics Machine Class: client Using VM: OpenJDK 64-Bit Server
JEP 514 Ahead-of-Time Command-Line Ergonomics // AOT 打头儿的估计都从graalvm剥离出来的? flexible-constructor-bodies) Flexible Constructor Bodies Amber Language None (#jep-514-ahead-of-time-command-line-ergonomics ) Ahead-of-Time Command-Line Ergonomics Leyden Performance New feature (#jep-515-ahead-of-time-method-profiling
39936K), 0.0124746 secs] [GC (Allocation Failure) 29195K->29008K(39936K), 0.0150616 secs] [Full GC (Ergonomics 55296K), 0.0102666 secs] [GC (Allocation Failure) 43543K->43393K(55808K), 0.0087281 secs] [Full GC (Ergonomics 60928K), 0.0104380 secs] [GC (Allocation Failure) -- 51630K->58798K(60928K), 0.0100362 secs] [Full GC (Ergonomics ) 58798K->51458K(60928K), 0.0055668 secs] [Full GC (Ergonomics) 58793K->58626K(60928K), 0.0045510 secs 39936K), 0.0274278 secs]:新生代的GC,GC后堆内存占用从7839K减少到7592K,堆大小为39936K 可以看到,多次YGC后,回收不了了,就产生了FGC: [Full GC (Ergonomics
8801.974: [G1Ergonomics (Concurrent Cycles) request concurrent cycle initiation, reason: occupancy 8822.704: [ G1Ergonomics (Mixed GCs) continue mixed GCs, reason: candidate old regions available, 8830.249: [G1Ergonomics (Mixed GCs) do not continue mixed GCs, reason: reclaimable percentage not 4948.653: [G1Ergonomics (Concurrent Cycles) request concurrent cycle initiation, reason: requested by GC cause, GC cause: G1 Humongous Allocation] 7677.280: [G1Ergonomics (Concurrent Cycles) do not
] 内存足够时,垃圾回收后:[B@1de0aca6 [GC (Allocation Failure) 9588K->9570K(15872K), 0.0013485 secs] [Full GC (Ergonomics ) 9570K->9506K(15872K), 0.0032467 secs] [Full GC (Ergonomics) 12659K->12549K(15872K), 0.0083257 secs ] [Full GC (Ergonomics) 13573K->13573K(15872K), 0.0043525 secs] [Full GC (Allocation Failure) 13573K (15872K), 0.0019272 secs] [GC (Allocation Failure) 9713K->9621K(15872K), 0.0015966 secs] [Full GC (Ergonomics
6144K)] 17722K->13790K(19968K), 0.0042190 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [Full GC (Ergonomics 3273K(1056768K)], 0.0129237 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] [B@46fbb2c1 4 [Full GC (Ergonomics 6144K)] 17722K->13757K(19968K), 0.0034897 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (Ergonomics
此例中就是19456K - 9216K = 10240K Parallel Old 是Parallel Scavenge 收集器的老年代版本 641.642: [Full GC (Ergonomics) [Full GC (Ergonomics) ,表示执行全局垃圾回收 [PSYoungGen: 728K->0K(9216K)] 格式为:[PSYoungGen: a->b(c)] 年轻代使用的是多线程垃圾收集器 执行完 byte6 byte[] byte6 = new byte[5 * _1M]; 控制台打印的GC日志 10342.704: [ Full GC (Ergonomics) [PSYoungGen 控制台打印的GC日志 10427.298: [Full GC (Ergonomics) [PSYoungGen: 7331K->7168K(9216K)] [ParOldGen: 8745K->8745K [Full GC (Ergonomics) [PSYoungGen: 7331K->7168K(9216K)] 本次 Minor GC 发生在PS Young Generation 年轻代 Eden Space
根据HotSpot VM的Ergonomics,我们机器上默认使用的就是Parallel GC。 可以看到,居然出现了两次FullGC(ParallelOld),GC的原因是Ergonomics,很明显不是因为内存不足引起(Allocation Failure)的,应该是可以避免的。 我没有指定-Xms,根据Ergonomics,初始堆的大小是1G。所以看上去是堆的动态增大(commit更多的堆)会触发FullGC?通过显式设置-Xms8G来看看, ? 两次由于Ergonomics引起的FullGC消失掉了,但是也可以看到committed heap仍然是在动态增大的,却没有再触发FullGC,因此可以确定,adaptive size policy引起的堆大小调整 试了下-XX:MaxGCPauseMillis= < N >和-XX:GCTimeRatio=< N>并没有什么提升,看来这部分的Ergonomics并不适用于短进程?
11534336 bytes, new threshold 15 (max 15) - age 1: 5011600 bytes, 5011600 total 27.884: [G1Ergonomics [G1Ergonomics (CSet Construction) start choosing CSet, _pending_cards: 1461, predicted base time: 35.25 [G1Ergonomics (CSet Construction) add young regions to CSet, eden: 159 regions, survivors: 13 regions [G1Ergonomics (CSet Construction) finish choosing CSet, eden: 159 regions, survivors: 13 regions, old global concurrent marking 日志 对于global concurrent marking过程,它的日志如下所示: 66955.252: [G1Ergonomics (Concurrent
)] 385242K->200111K(460800K), 0.0159145 secs] [Times: user=0.03 sys=0.03, real=0.02 secs] [Full GC (Ergonomics )] 706499K->357559K(918016K), 0.0314269 secs] [Times: user=0.09 sys=0.03, real=0.03 secs] [Full GC (Ergonomics 1330731K->655186K(1544192K), 0.0844278 secs] [Times: user=0.05 sys=0.11, real=0.08 secs] [Full GC (Ergonomics 比如默认情况下是15次”,结果我们观察前面两次Full GC日志发现,GC不到15次,结果年轻代就挪到老年代了 [Full GC (Ergonomics) [PSYoungGen: 10746K->0K [Full GC (Ergonomics) [PSYoungGen: 102898K->0K(591360K)] [ParOldGen: 254661K->278543K(483840K)] 357559K
但是你还是需要先搞清楚默认值为什么这么设置,默认值是从统计学里得来的,先看这里: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html
[Full GC (Ergonomics) [PSYoungGen: 4096K->4078K(4608K)] [ParOldGen: 11004K->10999K(11264K)] 15100K->15077K 0.0178676 secs] [Times: user=0.00 sys=0.00, real=0.02 secs] Exception in thread "main" [Full GC (Ergonomics Metaspace: 3922K->3922K(1056768K)], 0.0283656 secs] [Times: user=0.02 sys=0.00, real=0.03 secs] [Full GC (Ergonomics Metaspace: 3922K->3922K(1056768K)], 0.0319503 secs] [Times: user=0.01 sys=0.00, real=0.03 secs] [Full GC (Ergonomics Metaspace: 3998K->3998K(1056768K)], 0.0304574 secs] [Times: user=0.02 sys=0.02, real=0.03 secs] [Full GC (Ergonomics