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