Java VisualVM内存采样器-如何获取特定类的大小



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

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

我怎么能在这个工具中看到谁是"真正的"最大的类——那些包含所有这些字符串的类?(最好是我可以从这些类转到它们的String,而不是相反)我试着在heapDump中使用"最接近GC的根",但大约有4000000个字符串,所以我找到"有问题"的字符串的几率很小。。。

谢谢!!!

如果进行堆转储,可以找到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以找出这些对象的总大小。

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

最新更新