Java G1-周期性地发生两次连续的完全垃圾回收

Java G1-周期性地发生两次连续的完全垃圾回收,java,garbage-collection,java-7,Java,Garbage Collection,Java 7,我使用的是G1垃圾收集器,在CentOS 6 64位上的Java 7 update 45下使用1g堆。 我周期性地看到,两个完整的垃圾收集一个接一个地发生,而第一个垃圾收集会清理非常小的内存量,第二个垃圾收集会清理合理的内存量 我的gc日志中的示例: 25分钟后,这种情况再次发生: 你知道什么会导致这种行为吗?为什么在第一次完全gc期间未清除内存 我试图用最新的Java7更新67运行我的webapp,这种现象再次发生 如果我正确地理解了gc日志,那么从下面的年轻gc中,堆大小增加了18.8M,因

我使用的是G1垃圾收集器,在CentOS 6 64位上的Java 7 update 45下使用1g堆。 我周期性地看到,两个完整的垃圾收集一个接一个地发生,而第一个垃圾收集会清理非常小的内存量,第二个垃圾收集会清理合理的内存量

我的gc日志中的示例:

25分钟后,这种情况再次发生:

你知道什么会导致这种行为吗?为什么在第一次完全gc期间未清除内存

我试图用最新的Java7更新67运行我的webapp,这种现象再次发生

如果我正确地理解了gc日志,那么从下面的年轻gc中,堆大小增加了18.8M,因此假设导致完整gc的分配失败被该值绑定。即使堆上有更多的可用空间,为什么G1会触发完全gc?从附图中可以看出,堆的大小从未超过900M,为什么


我建议使用最新的更新,因为这可能是他们已经修复的行为。现在1GB堆非常小,我会尝试增加它,看看它是否表现得更好。模糊的经验法则是完整收集后使用的内存的3-5倍。我通常从32GB开始,如果这看起来是一种浪费,我会一直工作下去。不幸的是,在这种配置中,堆的大小是有限的。在堆大小为1.5g的其他配置中,我看到了更好的结果。回收弱引用需要一行两个GC。大概你的应用程序有很多使用弱引用的缓存存储,必须回收这些存储以实现合理的干净堆。我认为这可能是原因,但几乎找不到这样的缓存。此外,如果我多次运行手动gc,这不会发生。只有当gc决定应该进行弱引用时,才发生回收弱引用的情况,使用天知道的度量。弱引用的实现在Java中相当糟糕。