如何获取垃圾收集对象的统计信息?
How to get the statistics of the garbage collected objects?
是否可以看到 java 个对象(及其 class 类型)被设为 null 并且
- 还不是垃圾collected/cleaned
- 垃圾collected/cleaned.
这个统计数据将有助于了解有多少对象重复创建(通过错误的逻辑)而不是创建一次。
我认为这在理论上是可行的,但坦率地说,你会疯狂地尝试它。
查找不可访问对象的途径是使用 Java VM 工具接口 (JVMTI) 遍历堆中的所有对象(可访问或不可访问)以找到您要查找的对象。然后你通过 JVMTI 提取它的状态并(以某种方式)具体化它以便你可以显示它。
通常您会在单独的 JVM 中执行此操作;例如一个 运行 你的调试器或分析工具。但是应用程序可以将代理附加到自身,并使用它在 JVM 中挖掘。但是,这不是 JVMTI 的预期用途,我预计这样做可能 "hazards"。
您可以在此处阅读更多内容:
- Creating a Debugging and Profiling Agent with JVMTI
- Own your heap: Iterate class instances with JVMTI
但是如果你疯狂地试图让它工作,请不要怪我。
更新 我同意 Marko 的观点,你不太可能通过查看无法访问的对象来学习任何重要的东西。
to display the unwanted or null java objects that are not cleaned by the java garbage process
这不是一个明确定义的概念;至少没有有用的定义可以给你任何相关的东西。
一旦对象变得不可访问,分配对象的一块内存就可以被认为是空闲的。从某种意义上说,由于该块在某种意义上是 "overlooked",不会发生 内存不足事件 ,因此该块表示的内存量可供 JVM 分配器使用.
进一步注意,许多 "garbage collection" 算法通常做完全相反的事情:它们找到 live 对象并重新定位它们,以便它们占据一个连续的内存块。这些算法完全忽略了 "garbage" 个对象,并将它们视为空的 space.
因此,即使您设法编写了一些低级的 Java 基于代理的模块来枚举堆上的所有对象,您也不会获得任何有趣的见解:您无法访问的对象遇到只会碰巧流连忘返,因为JVM还没有感觉到需要重用他们的内存。
是否可以看到 java 个对象(及其 class 类型)被设为 null 并且
- 还不是垃圾collected/cleaned
- 垃圾collected/cleaned.
这个统计数据将有助于了解有多少对象重复创建(通过错误的逻辑)而不是创建一次。
我认为这在理论上是可行的,但坦率地说,你会疯狂地尝试它。
查找不可访问对象的途径是使用 Java VM 工具接口 (JVMTI) 遍历堆中的所有对象(可访问或不可访问)以找到您要查找的对象。然后你通过 JVMTI 提取它的状态并(以某种方式)具体化它以便你可以显示它。
通常您会在单独的 JVM 中执行此操作;例如一个 运行 你的调试器或分析工具。但是应用程序可以将代理附加到自身,并使用它在 JVM 中挖掘。但是,这不是 JVMTI 的预期用途,我预计这样做可能 "hazards"。
您可以在此处阅读更多内容:
- Creating a Debugging and Profiling Agent with JVMTI
- Own your heap: Iterate class instances with JVMTI
但是如果你疯狂地试图让它工作,请不要怪我。
更新 我同意 Marko 的观点,你不太可能通过查看无法访问的对象来学习任何重要的东西。
to display the unwanted or null java objects that are not cleaned by the java garbage process
这不是一个明确定义的概念;至少没有有用的定义可以给你任何相关的东西。
一旦对象变得不可访问,分配对象的一块内存就可以被认为是空闲的。从某种意义上说,由于该块在某种意义上是 "overlooked",不会发生 内存不足事件 ,因此该块表示的内存量可供 JVM 分配器使用.
进一步注意,许多 "garbage collection" 算法通常做完全相反的事情:它们找到 live 对象并重新定位它们,以便它们占据一个连续的内存块。这些算法完全忽略了 "garbage" 个对象,并将它们视为空的 space.
因此,即使您设法编写了一些低级的 Java 基于代理的模块来枚举堆上的所有对象,您也不会获得任何有趣的见解:您无法访问的对象遇到只会碰巧流连忘返,因为JVM还没有感觉到需要重用他们的内存。