2012-03-13 96 views
0

我想在我没有设计的程序中找到内存泄漏(我是新来的项目)。由于这是一个相当大的计划,我遇到了一些麻烦。我尝试了一些分析器,当尝试跟踪分配堆栈跟踪以查看哪些对象占用了所有内存时,大多数分析器都挂起或崩溃。找出什么对象垃圾收集器正在发布:

我在线程中运行System.gc();并试图找出它究竟是释放/释放的。从配置文件中,我可以看到它发布,但我需要知道它正在发布什么。

有没有什么方法从垃圾回收器获取运行时的信息,以了解它释放/释放哪些对象?

如果不是,或者如果这是一个糟糕的方法来考虑尝试解决这个问题,那么其他建议将不胜感激。

+0

一个分析器是你所需要的。找到一个有效的。或者弄清楚为什么你尝试失败的人。 – 2012-03-13 06:55:39

回答

1

我会用一个内存分析器找到内存泄漏。你可以从VisualVM开始。这可能会发现你的问题,但如果它不尝试一个像YourKit这样的商业分析器的评估版本。

这些工具不仅可以告诉你什么正在被丢弃,而且它首先在哪里创建。它有一个图形界面,所以你可以看到最大或最多的。

+0

这些看起来好多了比我所用的配置文件。谢谢! – 2012-03-22 06:46:41

2

我的首选查找内存泄漏的方法是通过使用-XX:+HeapDumpOnOutOfMemoryError作为JVM启动参数或使用jsconsole/jmap“按需”等待它发生(遵循OOM)来触发堆转储。

然后运行(平时大)通过优良的MAT转储文件 http://www.eclipse.org/mat/

+0

内存分析也可以通过另一个Eclipse插件'TPTP'来完成。 http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html – Jayy 2012-03-13 07:10:41

+0

是的,但不幸的是,TPTP似乎不喜欢我正在使用的OSX ... – 2012-03-13 07:22:42

0

我没有确切的解决方案,哪个对象将通过System.gc()实现;

但Java提供了内置的GUI工具设施Java监视和管理控制台

您发现JConsole的在Java/bin文件夹中运行它:使用命令

cd $JAVA_HOME/bin 
./jconsole