我的GC日志如下所示:
2015-11-05T18:49:55.230 + 0100:4.337:[GC [PSYoungGen: 387072K-> 27583K(451584K)] 387072K-> 27655K( 1483264K ),0.2037220秒] [时间:用户= 2.08 sys = 0.09,真实= 0.20秒]
2015-11-05T18:49:55.994 + 0100:5.101:[GC [PSYoungGen: 414655K-> 11758K(838656K)] 414727K-> 11838K( 1870336K ),0.1702880秒] [时间:用户= 2.13 sys = 0.05,实际= 0.18秒]
2015-11-05T18:49:57.248 + 0100:6.355:[GC [PSYoungGen: 785902K-> 10671K(838656K)] 785982K-> 10759K( 1870336K ),0.1309270秒] [时间:用户= 1.53 sys = 0.09,实际= 0.13秒]
2015-11-05T18:49:58.271 + 0100:7.378:[GC [PSYoungGen: 784815K-> 10763K(1612800K)] 784903K-> 10859K( 2644480K ),0.1273570秒] [时间:用户= 1.52 sys = 0.08,实际= 0.13秒]
2015-11-05T18:50:00.296 + 0100:9.403:[GC [PSYoungGen: 1559051K-> 10783K(1612800K)] 1559147K-> 10887K( 2644480K ),0.1275350 secs] [时间:用户= 1.50 sys = 0.06,实际= 0.13秒]
2015-11-05T18:50:01.853 + 0100:10.960:[GC [PSYoungGen: 1559071K-> 10735K(3122176K)] 1559175K-> 10847K( 4153856K ),0.1431470 secs] [时间:用户= 1.72 sys = 0.06,真实= 0.14秒]
2015-11-05T18:50:05.398 + 0100:14.505:[GC [PSYoungGen: 3107311K-> 576K(3123200K)] 3107423K-> 11081K( 4154880K ),0.1928080秒] [时间:用户= 2.31 sys = 0.05,实际= 0.20秒]
2015-11-05T18:50:08.266 + 0100:17.373:[GC [PSYoungGen: 3097152K-> 512K(6220288K)] 3107657K-> 11153K( 7251968K ),0.0060230秒] [时间:用户= 0.03 sys = 0.01,实际= 0.01秒]
如您所见,随着时间的推移有两个正在进行的趋势:
这导致我的应用程序使用的内存不断增长,这就是我想要解决的问题。 Max HeapSpace非常大,所以看起来JVM会以这种方式继续下去,直到它达到极限堆但我希望它能在某种程度上停止。因为正如你所看到的那样--Heap的实际用法并没有增长,它是不变的,这正是我对我的应用所期望的。
我看到了几个想法如何解决它:
问题在于我不知道如何针对 ParallelCollector 调整此选项,这是由JVM为我的环境选择的。
据我所知 ParallelCollector 忽略了JVM的所有设置,这可能对我有帮助,只留给我们指定高级 MaxGCPauseMillis 和 GCTimeRatio 参数。我在这里看到了一个类似的问题,并且只找到了串行收集器的参数,而不是我的情况:Encourage the JVM to GC rather than grow the heap?
看起来我对 ParallelCollector 的唯一选择是使用Xmx参数降低HeapSpace,这就是全部!
PS 正如我在我的问题中已经解释的那样,这个主题 - Encourage the JVM to GC rather than grow the heap? - 与JVM的串行收集器有关,并且不包含Parallel Collector的答案。这一点在该主题的初步描述中得到了明确的肯定。