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

aye*_*aye 6 java memory memory-leaks visualvm jvisualvm

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

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

我怎样才能在这个工具中看到谁是"真正的"最大的类 - 那些拥有所有这些字符串的类?(最好是如果我可以从这些类中获取它们的字符串而不是相反的方式)我尝试在heapDump中使用"root到最近的GC"但是有大约4,000,000个字符串,所以我有机会找到"有问题"那些很小......

谢谢!!!

par*_*tje 3

如果执行堆转储,您可以找到 20 个最大的对象(包括它引用的所有空间)。对于更多内容,我建议使用非常强大的 OQL 控制台。

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

Lot of String's taking up 20Mb 
   --- kept alive by --->
HashSet#28839 
   --- kept alive by --->
MyOwnClass#88293
Run Code Online (Sandbox Code Playgroud)

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