如何在没有引用的情况下访问Java堆对象?

4
我希望获取Java堆中所有对象的引用,即使我在我的活动线程中没有立即对这些对象的引用。我不需要非引用对象(那些“排队”等待垃圾回收),但希望获取任何仍在使用中的对象。
目标是序列化和存储所有对象以实现一种简单的执行状态持久性。我意识到当涉及到不同类型的瞬态状态时,这个问题会变得很深奥,但只是持久化对象和已加载的类定义对我很有用。
是否有一种访问堆的方式来实现这一点?我是否忽视了更直接的方法?

你想获取堆转储吗?还是你也想访问永久代? - Vineet Reynolds
我主要对从堆中(以编程方式)访问对象感兴趣。PermGen会给我类定义,这也很有趣,但我试图保持我的问题集中。 :-) - G__
3个回答

4

我建议您查看instrument包。对您感兴趣的类进行仪表化处理,以使构造函数注册所创建的实例。如果您不想使用java.lang.instrument或者对象是通过您可以控制的方式(如IoC容器或工厂)创建的,则可以采取更少神奇的做法。


我喜欢这种方法,因为它给了我一个很好的钩子来处理对象。谢谢。 - G__

1
如果您想以编程方式获取堆转储,您将无法在java.*或javax.*命名空间中找到合适的API。然而,Sun运行时附带了HotSpotDiagnosticMXBean,它将使您能够通过将堆的内容写入指定的磁盘文件来获取堆转储。

0

1
同意MattC的观点 - 这很酷,我想要检查一下,但我主要关心如何通过代码在同一个JVM中实现这一点。 - G__

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接