Java VisualVM内存采样器-如何获取特定类的大小
我的应用程序使用的内存比我想象的要多得多,我试图了解哪个类使用了大量内存,可能并没有释放它 我使用的是VisualVM,在内存采样器中,我可以看到大部分内存都用在了字符、字符串和字节上,我的所有类都使用字符串,但正如您所知,VisualVM显示了系统中的所有字符和字符串(所有字符都与字符串相同,因此很难理解谁持有它们), 据我所知,包含这些字符串的其他类的大小是在没有字符串的情况下计算的 我如何在这个工具中看到谁是“真正”最大的类——那些拥有所有这些字符串的类?(如果我能从这些类中得到它们的字符串,而不是相反的话,那就更好了) 我尝试在heapDump中使用“根到最近的GC”,但是有大约4000000个字符串,所以我找到“有问题”的字符串的机会非常小Java VisualVM内存采样器-如何获取特定类的大小,java,memory,memory-leaks,visualvm,jvisualvm,Java,Memory,Memory Leaks,Visualvm,Jvisualvm,我的应用程序使用的内存比我想象的要多得多,我试图了解哪个类使用了大量内存,可能并没有释放它 我使用的是VisualVM,在内存采样器中,我可以看到大部分内存都用在了字符、字符串和字节上,我的所有类都使用字符串,但正如您所知,VisualVM显示了系统中的所有字符和字符串(所有字符都与字符串相同,因此很难理解谁持有它们), 据我所知,包含这些字符串的其他类的大小是在没有字符串的情况下计算的 我如何在这个工具中看到谁是“真正”最大的类——那些拥有所有这些字符串的类?(如果我能从这些类中得到它们的字符
谢谢 如果进行堆转储,可以找到20个最大的对象(包括它引用的所有空间)。对于更多内容,我建议使用非常强大的OQL控制台 基本上,您正在搜索以下内容:
Lot of String's taking up 20Mb
--- kept alive by --->
HashSet#28839
--- kept alive by --->
MyOwnClass#88293
我建议你随机选取一个字符串,找到它的引用并分析它,直到找到一个可能的嫌疑人。一旦你有了这个嫌疑,你可以用OQL查询来找出这些对象的总大小。做一个堆转储,用打开它,然后在直方图中查找最大保留大小。我想你不能明确地说哪个类使用了多少内存。如果您正在某个不同的类中实例化另一个类的对象,您将如何进行?据我所知,您无法获得基于类的内存利用率。谢谢!我现在就试试这个,我希望我能用这个方法找到一些东西。嗨,你知道我怎样才能找到一个具体的大实例吗?我只看到最大的4000000个字符串,但看不到最大的特定实例。您已经获得了堆转储,其中classes视图将字符串指定为具有最多字节[%]。双击此按钮,将进入“实例”视图。在这里,您可以选择一个特定的实例,并按照底部窗格中的引用进行操作。哦,我找到了,谢谢!您还可以使用“保留”检查每个实例的大小,并以此方式查找最大的实例。谢谢你可以用VisualVM做同样的事情。