我有一个正在运行的 java webapp,我正在使用 visualVM 进行监控。
这是堆的图:
使用两组请求进行了测试,一组在大约 3:20,另一组在大约 4:40(它们在图中表示为仅有的两个峰值)。
我的问题是:这是否意味着我有内存泄漏?我担心中间部分,虽然 GC 运行,但堆一直保持在 250MB。
非常感谢您的见解。
最佳答案
在 3:20 的第一个请求导致一些内存被占用,但请注意,在第二个请求之后的 GC 回收了大部分内存。另外我认为 major GC 是在 4:40 的第二次请求之后才执行的。
看起来没有泄漏。我的理论是 3:20 的请求导致年轻代被填满,由此产生的次要 GC 将一些对象提升到老年代。由 4:40 的请求引起的下一次主要 GC 清除了大部分内容。
您可以通过在发出与 3:20 时相同的请求之前使用分析器标记堆来验证这一点,强制进行完整的 GC,然后检查哪些对象是延迟的。我不确定 VisualVM 是否允许您 (1) 标记堆和 (2) 强制执行完整 GC,但 OptimizeIt 曾经这样做过。
关于java - 可能的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2029595/