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

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

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

有没有办法访问堆才能实现这一目标? 我是否会忽视更直接的方法?

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

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

我建议您进行堆转储 ,然后使用Eclipse Memory Analyzer进行检查。

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

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

截图http://img181.imageshack.us/img181/4013/dominatortreegrouped.png