1

当使用 G1 收集器时,是否有人遇到过 JVM(热点)泄漏内存的问题?

我已将堆大小固定为 60GB(-ms 和 -ms 都设置为 60G),但 java 进程的大小(根据 ps 命令的 vsz 列)从 64GB 左右开始,但增加到 84GB 7小时内。

使用并行收集器,进程大小在 20 小时运行后保持稳定,大约为 65GB 左右。

有没有其他人对 G1 收集器有类似的问题?我正在运行一个非常简单的基准测试,并且我没有使用任何直接缓冲内存或其他堆外内存(我知道)。

Java版本为1.7.0,更新5

(我已经向 Oracle 提出了一个关于这个问题的错误,但我想我也会在这里检查一下,以防有人有解决方法)。

4

1 回答 1

1

有没有其他人对 G1 收集器有类似的问题?

很快——是的。

这是关于导致内存泄漏的主题:

使用 Java 创建内存泄漏

它包含有关G1的信息

使用 InflaterInputStream 在 c-tor(例如 PNGImageDecoder)中传递 new java.util.zip.Inflater() 而不是调用 inflater 的 end()。好吧,如果您只传入新的 c-tor,则没有机会......并且是的,如果将充气器作为 c-tor 参数手动传递,则在流上调用 close() 不会关闭充气器。这不是真正的泄漏,因为它会被终结器释放......当它认为有必要时。直到那一刻它严重消耗本机内存,它可能导致 linux oom_killer 杀死进程而不受惩罚。主要问题是 Java 中的最终确定非常不可靠,G1 直到 7.0.2 才使情况变得更糟。故事的寓意:尽快释放原生资源,终结器太差了。

这里也提到了泄漏: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 7152954

于 2012-06-17T20:37:02.667 回答