JavaGC:JVM增加了内存使用率,而不是运行GC

JavaGC:JVM增加了内存使用率,而不是运行GC,java,memory,garbage-collection,jvm,Java,Memory,Garbage Collection,Jvm,我的GC日志如下所示: 2015-11-05T18:49:55.230+0100:4.337[GC[PSYoungGen: 387072K->27583K(451584K)]387072K->27655K(1483264K),0.2037220秒] [次数:用户=2.08系统=0.09,实际=0.20秒] 2015-11-05T18:49:55.994+0100:5.101[GC[PSYoungGen: 414655K->11758K(838656K)]414727K->11838K(18703

我的GC日志如下所示:

2015-11-05T18:49:55.230+0100:4.337[GC[PSYoungGen: 387072K->27583K(451584K)]387072K->27655K(1483264K),0.2037220秒] [次数:用户=2.08系统=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系统=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系统=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系统=0.08,实际=0.13秒]

2015-11-05T18:50:00.296+0100:9.403:[GC[PSYoungGen: 1559051K->10783K(1612800K)]1559147K->10887K(2644480K),0.1275350 秒][次:用户=1.50系统=0.06,实际=0.13秒]

2015-11-05T18:50:01.853+0100:10.960[GC[PSYoungGen: 1559071K->10735K(3122176K)]1559175K->10847K(4153856K),0.1431470 秒][次:用户=1.72系统=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系统=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系统=0.01,实际=0.01秒]

正如您所看到的,随着时间的推移,有两种持续的趋势:

  • 堆分配从1.4 gb增长到7.2 gb,没有任何特殊原因
  • 轻微GC频率下降
  • 这会导致我的应用程序使用的内存不断增长,这正是我想要解决的问题。Max HeapSpace相当大,所以看起来JVM将继续这样做,直到达到堆的极限。但我希望它在某种程度上停止。因为正如您所看到的,堆的实际使用量并没有增长,而是恒定不变的,这正是我对应用程序的期望

    我看到了几种解决方法:

  • 使小GC更频繁
  • 降低YoungGen空间部分,以迫使次要GC更频繁
  • 减少总堆空间以强制小GC更频繁
  • 问题是,我不知道如何为JVM为我的环境选择的ParallelCollector调优它

    据我所知,ParallelCollector忽略了JVM的所有设置,这些设置可能对我有所帮助,只留给我们指定高级MaxGCPauseMillis和GCTimeRatio参数。我在这里看到了一个类似的问题,只找到了串行收集器的参数,这与我的情况不同:

    看起来我对ParallelCollector的唯一选择是使用Xmx参数降低HeapSpace,仅此而已

    PS
    正如我在问题中已经解释过的,这个主题——与JVM的串行收集器有关,没有关于并行收集器的答案。这一点在本主题的初始描述中得到了明确肯定。

    JVM正试图尽可能有效地利用可用空间。通常只是让它做自己的事情。另一方面,如果它没有它认为的那么多可用空间(你需要它来做其他事情),那么就少给它一些空间。最重要的问题是,这会导致实际的性能问题(例如GC暂停)。事实并非如此,但它会分配可用于其他应用程序的内存,这是一个问题。JVM的可能副本正试图尽可能有效地利用其可用空间。通常只是让它做自己的事情。另一方面,如果它没有它认为的那么多可用空间(你需要它来做其他事情),那么就少给它一些空间。最重要的问题是,这会导致实际的性能问题(例如GC暂停)。事实并非如此,但它会分配可用于其他应用程序的内存,这是一个问题。可能会重复