如何获取垃圾收集对象的统计信息?

时间:2015-02-22 12:32:03

标签: java performance memory-management garbage-collection

是否可以看到变为null且

的java对象(及其类类型)
  1. 尚未收集/清理垃圾
  2. 收集/清理垃圾。
  3. 此统计信息将有助于了解重复创建的对象数量(通过错误的逻辑),而不是创建一次。

2 个答案:

答案 0 :(得分:2)

我认为这在理论上是可行的,但坦率地说,你会疯狂地尝试它。

查找无法访问的对象的途径是使用Java VM工具接口(JVMTI)迭代堆中的所有对象(可访问或无法访问),以便找到您要查找的对象。然后你通过JVMTI提取它的状态并(以某种方式)重新启用它以便你可以显示它。

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

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

但是,如果你为了让这个工作变得疯狂,请不要责怪我。


更新我同意Marko的说明,通过查看无法访问的对象,您不太可能学到任何重要信息。

答案 1 :(得分:1)

  

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

这不是一个定义明确的概念;至少没有有用的定义会给你任何相关的东西。

只要该对象无法访问,就可以认为分配对象的内存对于所有实际目的都是免费的。块表示的内存量可供JVM分配器使用,因为在某种意义上,由于该块被“忽略”,因此不会发生内存不足事件

进一步注意,许多“垃圾收集”算法通常完全相反:它们找到 live 对象并重新定位它们,以便它们占用连续的内存块。这些算法完全忽略了“垃圾”对象,并将它们视为空白空间。

因此,即使您设法编写了一个基于Java代理的低级模块,它将枚举堆上的所有对象,您也不会获得任何有趣的洞察力:您遇到的无法访问的对象将碰巧徘徊因为JVM还没有觉得需要重用他们的内存。