Java App有很多内存问题

时间:2010-09-17 18:58:28

标签: java memory

我编写了一个非常复杂的Java应用程序,它实时对市场上的价格数据进行了大量计算,并且通过查看Windows中的任务管理器,这个吸盘每30秒接近1MEG并且性能很好,直到它接近300MEG左右的内存限制,然后g-collector真正开始并将我的CPU加速到50%左右,UI性能从我写的所有内容中迅速降低到目前为止听起来我有些不好代码正在进行,因为我的程序的性质是CPU密集型的,但是通过设计在内存中存储的数据非常少。

我需要一些帮助,可以采取一些好的后续步骤来了解我如何弄清楚问题是什么,我想如果我能看到哪些对象存储在内存中会有所帮助,因为我可能会有一些帮助糟糕的代码,但我心碎Java,因为我认为这些是我不必担心的问题。谢谢你的回答。 - 邓肯

3 个答案:

答案 0 :(得分:4)

  1. 确定一些合理的性能目标(内存使用量,吞吐量,延迟)。
  2. 将一些可重复的性能测试放在一起,越接近现实生活场景就越好。
  3. 抓住一个好的探查者。我已经使用了YourKit取得了很大的成功,Netbeans和Eclipse的分析器也不错。大多数体面的分析器都能够识别内存使用情况,GC和性能热点。
  4. 找出最大的罪魁祸首,并从列表的 TOP 开始解决问题。

答案 1 :(得分:1)

查看VisualVM。它位于当前的JDK bin目录中,为jvisualvm。如果没有内存泄漏,则在运行垃圾收集器时堆使用率会下降,并且您可以通过计算堆中对象的保留大小来查看哪些对象可能占用内存。

http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/intro.html

答案 2 :(得分:0)

与其他人一样,使用分析器查找正在消耗内存的内容。

如果您还不知道,垃圾收集器只能释放超出范围的对象的内存。也就是说,没有任何引用它们。完成后,确保它超出范围。这听起来像你在某种程度上将它锁定在某处。

另外,如果您想向GC建议清理它,请尝试以下方法:

的System.gc();
System.runFinalization();

同样,这只是对gc的建议;但是我发现如果在很多对象超出范围之后运行,它确实很有帮助。

最后,你可以调整你的vm参数。 有最小/最大堆大小设置的设置。如果它是一个关键应用程序将它们设置为相同并将其设置为高(这样就不必保持分配/解除分配 - 它只是在启动时抓取一个大块)。这不是解决方法,只是一种解决方法。