为什么我的堆会稳定增加并且完整的GC不会发生?

时间:2016-09-14 10:00:14

标签: java garbage-collection heap

我可以从GC日志中看到,堆使用的内存正在稳步增加,并且完整的GC从未像一天中说的那样发生过。该应用程序还没有崩溃。我应该寻找什么?任何指针都非常有用。我在linux机器上运行Java 7。

2 个答案:

答案 0 :(得分:1)

Java进程内存包括JVM内存空间(堆+少数其他区域)和非JVM内存(如果您在JVM中使用了一些本机库)。

通常堆永远不会推迟 - 释放内存以供JVM重用,但不会释放到操作系统(它取决于GC算法)。

JVM有两个控制堆大小-Xms-Xmx的选项,它们设置堆的初始大小和最大可能值(actually a bit more than 2 options)。

不断增长的进程​​内存占用可能是也可能不是内存泄漏的迹象。

您需要在JVM中启用GC日志记录或使用某些JVM工具(例如JVisualVM)来验证您的活动对象数量是否在增长。

Java中的内存泄漏通常表现为“Full GC”事件的序列,并且减少了间隔。

您不应期望JVM垃圾收集器将内存释放回操作系统。有些算法无法做到。有些人(例如G1)可以,但他们可能有过多的理由不立即这样做。

答案 1 :(得分:0)

为什么?因为某处存在内存泄漏或对象膨胀。我建议你运行MAT:http://eclipse.org/mat