如果Java应用程序有内存泄漏,JVM最终会耗尽内存并标记,对吧?

时间:2011-01-25 22:00:30

标签: java web-applications memory memory-leaks jvm

我认为这个问题的答案应该是肯定的...但我想我不太确定,因为我在问它:)

我只是想确定我的webapp是否在某处出现内存泄漏。如果内存使用量继续增加,最终应该产生Out of Memory错误,对吧?

5 个答案:

答案 0 :(得分:3)

如果您有大量泄漏,最终会出现OutOfMemoryError。

虽然,如果你有一个小泄漏,它可以运行很长一段时间而不会耗尽内存。它取决于泄漏的大小,堆大小以及服务器在更新或重新启动之前运行的时间。

答案 1 :(得分:3)

如果内存使用量持续增加,则为是。

但是,内存泄漏是指内存已分配但在不再相关时未释放的情况。定义并不意味着必须重复或增长

例如,如果你的JVM中有4GB的RAM,有一堆泄漏事件吃了3GB并且不会再有任何内存泄漏事件,你仍然只能限制在1GB。

因此,你很可能会有一个泄漏,即使是一个严重的泄漏,但是在你有足够的事件导致你的内存耗尽或其他部分的性能退化太多之前,你不会发现它。

根据我的经验,这些情况比人们期望的更为常见,使他们以追踪而臭名昭着。

答案 2 :(得分:1)

最后。 JVM有一个最大堆大小的概念,这意味着如果它达到了限制并尝试分配更多而不能,它将尝试垃圾收集;如果仍然无法分配内存,则会抛出异常。

答案 3 :(得分:1)

如果您正在尝试查找内存泄漏,使用jconsole监控您的webapp可能是个好主意。此外,JProbe可用于识别泄漏。

答案 4 :(得分:1)

有许多工具可用于分析,并且很多时候会自动隔离可能的内存泄漏。 jhat附带JDK; Eclipse Memory Analyzer是免费的,示例商业广告是YourKit