7

我的应用程序使用的内存比我想象的要多得多,我试图了解哪个类正在使用大量内存并且可能没有释放它。

我正在使用 VisualVM,在内存采样器中,我可以看到大部分内存都花在了字符、字符串和字节上,我的所有类都使用字符串,但是正如您所知,VisualVM 显示系统中的所有字符和字符串(所有字符与字符串相同,这使得很难理解谁持有它们),因为我知道持有这些字符串的其他类的大小是在没有字符串的情况下计算的。

我如何在这个工具中看到谁是“真正的”最大的类——那些拥有所有这些字符串的类?(最好是如果我可以从这些类中获取它们的字符串,而不是相反)我尝试在 heapDump 中使用“到最近的 GC 的根”,但是大约有 4,000,000 个字符串,所以我有机会找到“有问题的”那些非常小...

谢谢!!!

4

2 回答 2

2

如果您进行堆转储,您可以找到 20 个最大的对象(包括它引用的所有空间)。除此之外,我推荐使用非常强大的 OQL 控制台。

基本上,您正在搜索以下内容:

Lot of String's taking up 20Mb 
   --- kept alive by --->
HashSet#28839 
   --- kept alive by --->
MyOwnClass#88293

我建议你取一个随机字符串,找到它的推荐人并分析它,直到找到可能的嫌疑人。一旦有了这个嫌疑人,您就可以使用http://visualvm.java.net/oqlhelp.html#rsizeof进行 OQL 查询,以找出这些对象的总大小。

于 2012-01-09T14:17:04.377 回答
2

做一个堆转储,用MAT打开它并在直方图中查找最大的保留大小。

于 2012-01-09T16:25:37.420 回答