【问题标题】:Java VisualVM memory sampler - how to get the size of a specific classJava VisualVM 内存采样器 - 如何获取特定类的大小
【发布时间】:2012-02-06 01:04:36
【问题描述】:

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

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

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

谢谢!!!

【问题讨论】:

  • 我认为你不能明确地说哪个类使用了多少内存。如果你在某个不同的类中实例化另一个类的对象,你会怎么做?另外据我所知,您无法获得基于类的内存利用率。

标签: java memory memory-leaks visualvm jvisualvm


【解决方案1】:

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

【讨论】:

  • 谢谢!我现在就试试这个,我希望我能用这个方法找到一些东西。
  • 您好,您知道如何找到特定的大型实例吗?我只看到最大的 4,000,000 个字符串,但看不到最大的特定实例。
  • 您已经获得了堆转储,其中类视图将 String 指定为具有最多字节 [%]。您双击它,这会将您带到 Instances 视图。在这里,您可以选择特定实例并按照底部窗格中的引用进行操作。
  • 哦,我找到了,谢谢!您还可以使用“保留”检查每个实例的大小,并以这种方式找到最大的实例。谢谢!
【解决方案2】:

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

【讨论】:

  • 你可以用 VisualVM 做同样的事情。
猜你喜欢
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2020-02-18
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2015-01-14
相关资源
最近更新 更多