簡體   English   中英

Java垃圾收集優化--XX:GCTimeLimit和-XX:GCHeapFreeLimit無法正常工作?

[英]Java Garbage Collection Tuning - -XX:GCTimeLimit and -XX:GCHeapFreeLimit not working?

在我們的GC日志中,我們看到了延長時間(超過20分鍾)的這種模式。 這是這段時間內運行的完整GC的小快照:

2017-08-17T17:40:55.958-0500: 2263.468: [Full GC [PSYoungGen: 200192K->200191K(272896K)] [ParOldGen: 698843K->698835K(698880K)] 899035K->899026K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3358980 secs] [Times: user=12.79 sys=0.03, real=0.33 secs] 
2017-08-17T17:40:56.294-0500: 2263.805: [Full GC [PSYoungGen: 200192K->200191K(272896K)] [ParOldGen: 698835K->698835K(698880K)] 899027K->899027K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.4146470 secs] [Times: user=14.99 sys=0.04, real=0.42 secs] 
2017-08-17T17:40:56.710-0500: 2264.220: [Full GC [PSYoungGen: 200192K->200191K(272896K)] [ParOldGen: 698835K->698835K(698880K)] 899027K->899027K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3549330 secs] [Times: user=14.16 sys=0.03, real=0.35 secs] 
2017-08-17T17:40:57.065-0500: 2264.576: [Full GC [PSYoungGen: 200191K->200191K(272896K)] [ParOldGen: 698835K->698835K(698880K)] 899027K->899027K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3333880 secs] [Times: user=12.86 sys=0.04, real=0.34 secs] 
2017-08-17T17:40:57.399-0500: 2264.910: [Full GC [PSYoungGen: 200191K->200191K(272896K)] [ParOldGen: 698843K->698835K(698880K)] 899035K->899027K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3361300 secs] [Times: user=13.10 sys=0.04, real=0.33 secs] 
2017-08-17T17:40:57.736-0500: 2265.246: [Full GC [PSYoungGen: 200191K->200191K(272896K)] [ParOldGen: 698845K->698835K(698880K)] 899037K->899027K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3165070 secs] [Times: user=11.66 sys=0.03, real=0.32 secs] 
2017-08-17T17:40:58.053-0500: 2265.564: [Full GC [PSYoungGen: 200191K->200191K(272896K)] [ParOldGen: 698835K->698834K(698880K)] 899027K->899026K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3860970 secs] [Times: user=15.29 sys=0.09, real=0.39 secs] 
2017-08-17T17:40:58.440-0500: 2265.951: [Full GC [PSYoungGen: 200192K->200191K(272896K)] [ParOldGen: 698834K->698834K(698880K)] 899026K->899026K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3679940 secs] [Times: user=14.06 sys=0.04, real=0.37 secs] 
2017-08-17T17:40:58.809-0500: 2266.319: [Full GC [PSYoungGen: 200192K->200191K(272896K)] [ParOldGen: 698834K->698834K(698880K)] 899026K->899026K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3336190 secs] [Times: user=12.92 sys=0.03, real=0.33 secs] 
2017-08-17T17:40:59.143-0500: 2266.654: [Full GC [PSYoungGen: 200192K->200191K(272896K)] [ParOldGen: 698834K->698834K(698880K)] 899026K->899026K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3498820 secs] [Times: user=13.31 sys=0.04, real=0.35 secs] 
2017-08-17T17:40:59.494-0500: 2267.004: [Full GC [PSYoungGen: 200192K->200191K(272896K)] [ParOldGen: 698834K->698834K(698880K)] 899026K->899026K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3055050 secs] [Times: user=11.00 sys=0.04, real=0.31 secs] 
2017-08-17T17:40:59.800-0500: 2267.310: [Full GC [PSYoungGen: 200192K->200191K(272896K)] [ParOldGen: 698834K->698834K(698880K)] 899026K->899026K(971776K) [PSPermGen: 26732K->26732K(26880K)], 0.3235970 secs] [Times: user=12.22 sys=0.05, real=0.32 secs] 

因此,我們使Full GC每秒運行多次,從而使該JVM幾乎沒有時間做任何實際的工作。 我們嘗試設置以下參數以在發生這種情況時強制執行“ GC開銷” OOM:

-XX:GCTimeLimit=5    
-XX:GCHeapFreeLimit=50

這是有關這些的Oracle文檔,以供參考: https : //docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html

我認為有了這些設置(> 5%的GC時間花費,<50%的空閑空間釋放),我們將觸發OutOfMemoryError:超出了GC開銷限制。 有什么想法為什么不能像我們期望的那樣觸發?

編輯-更多信息,這是GC日志的頂部,顯示版本信息,參數等:

Java HotSpot(TM) Server VM (24.101-b14) for linux-x86 JRE (1.7.0_101-b14), built on Mar 31 2016 05:26:20 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)
Memory: 4k page, physical 131954348k(1343412k free), swap 125812704k(125512524k free)
CommandLine flags: -XX:GCHeapFreeLimit=50 -XX:GCTimeLimit=5 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/cerner/core_files -XX:InitialHeapSize=446693376 -XX:MaxHeapSize=1073741824 -XX:OnOutOfMemoryError=/usr/local/cwx/ejs_oom.ksh -XX:+PrintGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+UseParallelGC 

一種可能性是您已使用-XX:-UseGCOverheadLimit禁用它-XX:-UseGCOverheadLimit

編輯-更多信息,這是GC日志的頂部,顯示版本信息,參數等: -XX:GCTimeLimit=0

這顯然不是您說的已設置的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM