我们有一个Java服务器应用程序,该应用程序会产生大量临时数据,因此在GC中会消耗大量时间。我们正在尝试对其JVM设置进行微调,以实现最佳性能。当前,我们的jvm设置为:java -server -Xmx45700m -Xms34275m -XX:InitialTenuringThreshold=15 -XX:MaxTenuringThreshold=15 -XX:NewSize=32132m -XX:SurvivorRatio=4
我们设置较高的幸存者比率,以防止此临时数据移至旧的生成区域。
我们看到的怪异行为是随着时间的推移,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?
最佳答案
因为您使用的是并行收集器,所以将吞吐量作为目标。
如果每个占位间隔中只有一小部分对象死亡,那么在幸存者空间之间来回复制5GB对象的次数很可能会浪费CPU周期。
因此,GC会缩小幸存者空间,并尽快将其复制到旧世代中,以避免重复成本,希望相对于所收集垃圾的数量而言,一种稀有的旧世代GC在所花费的CPU周期方面将更有效率,即提高吞吐量。
您的旧一代此时只有2GB的对象。偶尔收集一次要比GCing多次5GB价值的对象便宜得多。
庞大的年轻一代总体而言似乎很奇怪。您是否实际进行过测量并确认可以改善任何效果?