我有一个Java应用程序,内存不足,但我不知道哪些代码分配了内存。是否有一种应用程序可以检查这个问题?我使用Eclipse。
如果你使用Eclipse,我建议使用Eclipse Memory Analyzer插件。这个工具非常好用,甚至会提供一个报告来指出可能的泄漏嫌疑。我用它查看过超过1G的堆转储文件而没有问题。我只是使用JDK自带的jconsole来获取转储文件。
还有一个非常好的博客介绍如何使用这个工具,这个博客的作者之一也是这个工具的开发者。
这个工具也是免费的。
VisualVM是一种可视化工具,将多个命令行JDK工具和轻量级分析功能集成在一起。它旨在用于生产和开发期间的使用,并进一步增强了监控和性能分析Java SE平台的能力。
而且,它已经被包含在JDK中了。
Yourkit是一款非常棒的工具,我已经在很多场合使用它来寻找和记录性能问题。Eclipse与TPTP框架也可以用来做这件事情。它还可以对远程应用服务器进行优化(需要启用性能分析代理并在JVM中开启远程调试),而且可以在几乎任何J2EE环境下运行性能分析。
如果您需要快速分析代码或者不使用Eclipse或较旧版本的jvm,则hprof是一个不错的选择。(我只是将其作为参考提供。)
前几天我不得不找到一个导致2.6G堆转储的内存泄漏源。Jhat需要惊人的20G堆大小才能在不崩溃的情况下处理它。Eclipse内存分析器只用了不到10G就完成了。话虽如此,我发现这两个工具都很有用,但建议首先使用内存分析器以更有效地使用内存和更易于使用。
我对所使用的内存量感到非常惊讶,但我可以向您保证,如果我使用更少的内存,我会遇到OutOfMemory错误。