当前位置: 首页 > 知识库问答 >
问题:

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

郏瀚
2023-03-14

是否可以看到被设为null的java对象(及其类类型)以及

  1. 尚未收集/清理垃圾
  2. 垃圾收集/清理。

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

共有2个答案

赵宏达
2023-03-14

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

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

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

进一步注意,许多“垃圾回收机制”算法通常做的恰恰相反:它们找到活动对象并重新定位它们,这样它们就占据了一个连续的内存块。这些算法只是忘记了“垃圾”对象,并将它们视为空白空间。

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

高奇
2023-03-14

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

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

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

您可以在此处阅读更多内容:

  • 使用JVMTI创建调试和分析代理
  • 拥有你的堆:使用JVMTI迭代类实例

但如果你为了让这一切正常运转而发疯,请不要怪我。

更新我同意Marko的观点,即通过观察无法到达的对象,你不太可能学到任何有意义的东西。

 类似资料:
  • 问题内容: 如何防止对象收集垃圾? 是否有通过终结或幻影引用的方法或任何其他方法? 采访中有人问我这个问题。面试官建议可以使用。 问题答案: 保持参考。如果过早地收集了对象,则表明您的应用程序设计中存在错误。 垃圾收集器仅收集应用程序中没有引用的对象。如果没有可以自然引用所收集对象的对象,请问自己为什么要保持它的生命。 通常没有引用但想要保留一个对象的一个​​用例是单例。在这种情况下,您可以使用静

  • 有人能给我解释一下原因吗?

  • [GC(分配失败)[defnew:10931K->472K(12288K),0.0053905秒]10931K->10712K(39616K),0.0054285秒][times:user=0.00 sys=0.00,real=0.01秒] [GC(分配失败)[defnew:10712k->472k(12288k),0.0057686秒]20952k->20952k(39616k),0.00580

  • 问题内容: 我有两节课 假设我在代码中使用对象B [say ],并在最终使用它后将其设置为。我知道B的对象现在可用于垃圾回收了。 我知道在将b设置为null之后,它将 立即有资格 进行垃圾回收吗?但是类型A的对象呢?将B设置为以后,是否可以 立即 将其用于垃圾回收?还是 在B被垃圾回收之后 才有资格 进行 垃圾回收 ? 从理论上讲,在对B进行垃圾收集之前,还有参考吗?因此,SUN JVM编译器将在

  • 每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1

  • 问题内容: 有没有一种方法可以检查垃圾收集器是否可以提取对象? 在我的代码中的某个地方,我有一个对象的引用: 然后,通过Eclipse Debugger,获得对象的存储位置。之后,我将引用设置为null: 有什么方法可以检查以前引用的对象现在是否适合垃圾回收,或者是否有其他引用? 非常感谢, 斯特凡 问题答案: 您无法在运行时使用任意对象执行此操作,实际上,不可能完全确定地执行此操作。但是,有两种