【问题标题】:How to get the statistics of the garbage collected objects?如何获取垃圾回收对象的统计信息?
【发布时间】:2015-04-23 20:02:41
【问题描述】:

是否有可能看到被设为 null 并且是

的 java 对象(及其类类型)
  1. 尚未收集/清理垃圾
  2. 垃圾收集/清理。

此统计数据将有助于了解(通过错误的逻辑)重复创建了多少对象,而不是一次创建。

【问题讨论】:

  • 一般而言,您如何识别“不需要的”对象?
  • 你不需要引用一个对象来显示它吗?在这种情况下,它不会被 GC 处理。你想这样做有什么特别的原因吗?
  • 谢谢安迪·特纳。如果我在 jframe 上有一个 jbutton,并且如果我从中删除了那个 jbutton。在这种情况下,我想观察 jvm 使用垃圾收集过程释放的 jbutton 的内存。
  • 感谢阿德里安·莱昂哈德。是的,在这种情况下,不可能获得 GC。但是还有其他方法可以找到吗?这是我的问题。

标签: java performance memory-management garbage-collection


【解决方案1】:

我认为理论上是可行的,但坦率地说,你会疯了。

查找不可访问对象的途径是使用 Java VM 工具接口 (JVMTI) 遍历堆中的所有对象(可访问或不可访问),以便找到您要查找的对象。然后通过 JVMTI 提取其状态并(以某种方式)对其进行具体化以便您可以显示它。

通常您会在单独的 JVM 中执行此操作;例如运行调试器或分析工具的那个。但是应用程序可以将代理附加到自身,并使用它在 JVM 中进行挖掘。但是,这不是 JVMTI 的预期用途,我预计这样做可能会有“危险”。

您可以在这里阅读更多内容:

但是,如果你疯狂地试图让它工作,请不要怪我。


更新我同意 Marko 的说法,即您不太可能通过查看无法访问的对象来学习任何重要的东西。

【讨论】:

    【解决方案2】:

    显示java垃圾进程没有清理的不需要的或空的java对象

    这不是一个定义明确的概念;至少没有任何有用的定义可以为您提供任何相关信息。

    一旦该对象变得无法访问,就可以将分配对象的一块内存用于所有实际目的。块所代表的内存量可供 JVM 分配器使用,因为在某种意义上该块被“忽略”而不会发生 内存不足事件

    进一步注意,许多“垃圾收集”算法通常会做完全相反的事情:它们找到活动的对象并重新定位它们,以便它们占用一个连续的内存块。这些算法根本没有注意到“垃圾”对象并将它们视为空白空间。

    因此,即使您设法编写了一些基于 Java 代理的低级模块来枚举堆上的所有对象,您也不会获得任何有趣的见解:您遇到的无法访问的对象会碰巧逗留on 因为 JVM 还没有感觉到需要重用它们的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      相关资源
      最近更新 更多