Java内存问题的诊断策略

xid 发布于 2018-06-01 java 最后更新 2018-06-01 10:00 95 浏览

我负责调试Java(J2SE)应用程序,该应用程序在一段时间的活动后开始抛出OutOfMemory异常。我是Java新手,但有编程经验。我有兴趣了解如何诊断此类问题的好方法? 到目前为止,我已经使用JConsole来了解发生了什么。我有一种预感,那就是有没有被正确释放的对象,因此在垃圾回收期间没有被清理。 是否有任何工具可用于获取物体生态系统的图片?你会从哪里开始?

已邀请:

jdolor

赞同来自:

我会从一个适当的Java分析器开始。 JConsole是免费的,但它远不及那些花钱的功能。我使用JProfiler,这是非常值得的钱。有关更多选项和意见,请参阅https://stackoverflow.com/questions/14762/please-recommend-a-java-profiler

det

赞同来自:

尝试使用Eclipse Memory Analyzer或任何其他可以处理Java堆转储的工具,然后使用运行内存时产生堆转储的活动来运行应用程序。 然后分析堆转储并查找可疑的高对象数。 有关heap dump的更多信息,请参阅这篇文章。 编辑:另外,请注意,你的应用程序可能只是合法地需要比你最初想象的更多的内存。您可以尝试将java最小和最大内存分配增加到更大的内存,然后查看您的应用程序是无限期运行还是稍微进一步。

gomnis

赞同来自:

http://www.yourkit.com/download/index.jsp是您需要的唯一工具。 您可以在(1)应用程序开始时间拍摄快照,以及(2)在运行应用程序N个时间后,然后比较快照以查看内存分配的位置。它还会对OutOfMemoryError拍摄快照,以便您可以将此快照与(1)进行比较。 例如,我必须排除故障的最新项目抛出OutOfMemoryError异常,并且在启动YourKit之后,我意识到大部分内存实际上正在分配给某个ehcache“LFU”类,问题是我们指定某个POJO的负载是缓存在内存中,但我们没有指定足够的-Xms和-Xmx(开始和最大JVM内存分配)。 我也用过Linux的vmstat例如有些Linux平台没有启用足够的交换,或者不分配连续的内存块,然后存在jstat(与JDK捆绑)。 更新请参阅https://stackoverflow.com/questions/14762/please-recommend-a-java-profiler

ueos

赞同来自:

您还可以将“UnhandledExceptionHandler”添加到您的应用程序线程中。这将捕获'未捕获'异常,就像内存不足错误,并且您至少会知道引发异常的位置。通常情况下,这不是问题,而是无法满足的'新'。作为一个规则,我总是添加UnhandledExceptionHandler到一个线程,如果没有别的要添加日志记录。

eenim

赞同来自:

最新版本的Sun JDK包含VisualVM,它本身就是Netbeans分析器。它工作得很好。