我的应用程序使用的内存比我想的要多得多,而且我试图了解哪个类正在使用大量内存而可能没有释放它。
我正在使用VisualVM,在内存采样器中我可以看到大部分内存都花在了Chars,Strings和Bytes上,我的所有类都使用了Strings,但是你知道VisualVM在系统中显示了所有的Chars和Strings (所有的Chars都与Strings相同,这使得很难理解谁拥有它们), 据我所知,持有这些字符串的其他类的大小是在没有字符串的情况下计算的。
我怎样才能在这个工具中看到谁是“真正的”最大的类 - 包含所有这些字符串的类? (最好是我可以从这些课程到他们的弦乐而不是相反的方式) 我尝试在heapDump中使用“root到最近的GC”,但是大约有4,000,000个字符串,所以我找到“有问题”字符串的机会非常小......
感谢!!!
答案 0 :(得分: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查询,以找出这些对象的总大小。
答案 1 :(得分:2)
进行堆转储,使用MAT打开它,并在直方图中查找最大的保留大小。