Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java VisualVM内存采样器-如何获取特定类的大小_Java_Memory_Memory Leaks_Visualvm_Jvisualvm - Fatal编程技术网

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

Java VisualVM内存采样器-如何获取特定类的大小,java,memory,memory-leaks,visualvm,jvisualvm,Java,Memory,Memory Leaks,Visualvm,Jvisualvm,我的应用程序使用的内存比我想象的要多得多,我试图了解哪个类使用了大量内存,可能并没有释放它 我使用的是VisualVM,在内存采样器中,我可以看到大部分内存都用在了字符、字符串和字节上,我的所有类都使用字符串,但正如您所知,VisualVM显示了系统中的所有字符和字符串(所有字符都与字符串相同,因此很难理解谁持有它们), 据我所知,包含这些字符串的其他类的大小是在没有字符串的情况下计算的 我如何在这个工具中看到谁是“真正”最大的类——那些拥有所有这些字符串的类?(如果我能从这些类中得到它们的字符

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

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

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


谢谢

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

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

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

我建议你随机选取一个字符串,找到它的引用并分析它,直到找到一个可能的嫌疑人。一旦你有了这个嫌疑,你可以用OQL查询来找出这些对象的总大小。

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

我想你不能明确地说哪个类使用了多少内存。如果您正在某个不同的类中实例化另一个类的对象,您将如何进行?据我所知,您无法获得基于类的内存利用率。谢谢!我现在就试试这个,我希望我能用这个方法找到一些东西。嗨,你知道我怎样才能找到一个具体的大实例吗?我只看到最大的4000000个字符串,但看不到最大的特定实例。您已经获得了堆转储,其中classes视图将字符串指定为具有最多字节[%]。双击此按钮,将进入“实例”视图。在这里,您可以选择一个特定的实例,并按照底部窗格中的引用进行操作。哦,我找到了,谢谢!您还可以使用“保留”检查每个实例的大小,并以此方式查找最大的实例。谢谢你可以用VisualVM做同样的事情。