【发布时间】:2012-04-23 22:26:52
【问题描述】:
如果有一个明显的答案,我仍在学习 Java 的绳索,很抱歉。我有一个占用大量内存的程序,我想找到一种方法来减少它的使用,但是在阅读了许多 SO 问题后,我认为我需要在开始优化它之前证明问题出在哪里。
这就是我所做的,我在程序的开头添加了一个断点并运行它,然后我启动了 visualVM 并让它分析内存(我也在 netbeans 中做了同样的事情,只是为了比较结果和它们是相同的)。我的问题是我不知道如何阅读它们,我得到的最高区域只是说 char[] 并且我看不到任何代码或任何东西(这是有道理的,因为 visualvm 正在连接到 jvm 并且看不到我的源,但 netbeans 也不会像在进行 cpu 分析时那样向我显示源)。
基本上,我想知道的是所有内存都在使用哪个变量(希望有更多详细信息,例如在哪种方法中),这样我就可以专注于在那里工作。有没有简单的方法可以做到这一点?我现在正在使用 eclipse 和 java 进行开发(并专门安装了用于分析的 visualVM 和 netbeans,但我愿意安装您认为可以完成这项工作的任何其他东西)。
编辑:理想情况下,我正在寻找可以获取所有对象并按大小对它们进行排序的东西(这样我就可以看到哪个对象占用了内存)。目前它返回一般信息,如 string[] 或 int[] 但我想知道它指的是哪个对象,以便我可以进一步优化它的大小。
【问题讨论】:
-
我使用了一个分析器,它也向我展示了对象被分配的位置。我不知道 VisualVM 是否可以做到这一点,但它非常有用。我使用的是YourKit,但它不是免费的(但你可以获得评估许可证)
-
@PeterLawrey 我实际上阅读了您不久前写的一个答案,您提到 yourkit 是您使用的首选,我确实查了一下(因为您的建议总是很棒)但是是的,它有点贵我只是在学习。
-
如果不使用检测您的代码的东西,任何分析器都无法指出哪个实例 == 您在源代码中称为引用。