2015-05-31 29 views
2

我們有一個產生大量臨時數據的java服務器應用程序,因此在GC中消耗了大量時間。我們正在嘗試微調其JVM設置以獲得最佳性能。目前我們的jvm設置如下:java -server -Xmx45700m -Xms34275m -XX:InitialTenuringThreshold=15 -XX:MaxTenuringThreshold=15 -XX:NewSize=32132m -XX:SurvivorRatio=4JVM堆 - 爲什麼S0/S1的大小隨着時間的推移而降低?

我們設置了較高的倖存者比率,以防止這個臨時數據被移動到老一代區域。

我們看到的奇怪行爲是隨着時間的推移,S0/S1尺寸從5G的配置大小減小到小於1G。

這是從應用程序生命週期的開始: 堆

PSYoungGen  total 27419648K, used 9887259K [0x00007ff819f80000, 0x00007ffff2380000, 0x00007ffff2380000) 
    eden space 21936128K, 44% used [0x00007ff819f80000,0x00007ffa6773e488,0x00007ffd54d80000) 
    from space 5483520K, 4% used [0x00007ffea3880000,0x00007ffeb18489f0,0x00007ffff2380000) 
    to space 5483520K, 0% used [0x00007ffd54d80000,0x00007ffd54d80000,0x00007ffea3880000) 
ParOldGen  total 2194432K, used 104K [0x00007ff4c9f80000, 0x00007ff54fe80000, 0x00007ff819f80000) 
    object space 2194432K, 0% used [0x00007ff4c9f80000,0x00007ff4c9f9a018,0x00007ff54fe80000) 
PSPermGen  total 37376K, used 37233K [0x00007ff4c4d80000, 0x00007ff4c7200000, 0x00007ff4c9f80000) 
    object space 37376K, 99% used [0x00007ff4c4d80000,0x00007ff4c71dc418,0x00007ff4c7200000) 

And this is after some time: 
Heap 
PSYoungGen  total 32397312K, used 4399893K [0x00007ff819f80000, 0x00007ffff2380000, 0x00007ffff2380000) 
    eden space 31891456K, 12% used [0x00007ff819f80000,0x00007ff907a4cbc0,0x00007fffb4780000) 
    from space 505856K, 99% used [0x00007fffb4780000,0x00007fffd35788b8,0x00007fffd3580000) 
    to space 505856K, 0% used [0x00007fffd3580000,0x00007fffd3580000,0x00007ffff2380000) 
ParOldGen  total 2194432K, used 774462K [0x00007ff4c9f80000, 0x00007ff54fe80000, 0x00007ff819f80000) 
    object space 2194432K, 35% used [0x00007ff4c9f80000,0x00007ff4f93cfa40,0x00007ff54fe80000) 
PSPermGen  total 45568K, used 45222K [0x00007ff4c4d80000, 0x00007ff4c7a00000, 0x00007ff4c9f80000) 
    object space 45568K, 99% used [0x00007ff4c4d80000,0x00007ff4c79a9900,0x00007ff4c7a00000) 

爲什麼會減少從5G到0.5G?

回答

2

因爲您正在使用以吞吐量爲目標的並行收集器。

如果在每個持續時間間隔內只有很小比例的對象死亡,則在倖存空間之間來回複製5GB的對象最有可能會浪費CPU週期。 因此,GC縮小了生存空間,並儘快將其複製到老一代,以避免重複花費,希望罕見的老式GC相對於所收集的垃圾數量在CPU週期方面更有效率,即提高吞吐量。

您的舊版本目前只有2GB的物件。偶爾收集這些東西要比GCing 5GB的物品便宜好幾倍。

龐大的年輕一代似乎很奇怪的一般。你有沒有做過測量,並確認這可以改善任何事情?

相關問題