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

时间:2009-09-05 20:43:30

标签: java jvm persistence heap

我想获得对Java堆中所有对象的引用,即使我没有立即在活动线程中引用这些对象。我不需要非引用的对象(那些“排队”用于垃圾收集),但是想要得到任何仍在使用的对象。

目标是序列化并存储所有对象,以实现穷人的执行状态持久性。我意识到兔子洞在涉及不同类型的瞬态时会变深,但只是坚持物体和物体。加载的类定义对我有用。

有没有办法访问堆才能实现这一目标?我是否忽略了一种更直接的做法?

3 个答案:

答案 0 :(得分:3)

我会查看instrument包。检测您感兴趣的类,以便ctor注册创建的实例。如果您不想使用java.lang.instrument,或者如果对象是通过您可以控制的东西(一个IoC容器或工厂)创建的,那么您可以通过AspectJ执行此操作,那么您可以做一些不太神奇的好块。

答案 1 :(得分:1)

如果要以编程方式进行堆转储,则无法在java。*或javax。*命名空间中找到合适的API。但是,Sun运行时附带HotSpotDiagnosticMXBean,这将使您能够通过将堆的内容写入磁盘中的指定文件来进行堆转储。

答案 2 :(得分:0)

我建议您使用heap dump,然后使用the Eclipse Memory Analyser进行检查。

可用视图允许您深入查看实例级别,查看对象属性。您甚至可以使用OQL - 以及类似SQL的查询语言来查询对象。

以下屏幕截图中的左侧面板演示了检查字段值。

screenshot http://img181.imageshack.us/img181/4013/dominatortreegrouped.png