我希望获得Java堆中所有对象的引用,即使我没有立即在活动线程中获得对这些对象的引用。我不需要非引用对象(那些“排队”进行垃圾收集的对象),但希望获得仍在使用的任何对象。目标是序列化和存储所有的对象,以实现穷人的执行状态持久化。我意识到,当涉及到不同类型的 transient 时,兔子洞会很深,但简单地持久化对象和加载的类定义对我来说会很有用。有没有一种方法可以访问堆来实现这一点?我是不是忽略了一种更直接的方法?
rsaldnfx1#
我会研究一下instrument包。插装你感兴趣的类,这样ctor就可以注册创建的示例。如果你不想使用java.lang.instrument,或者如果对象是通过你可以控制的东西(IoC容器或工厂)创建的,那么你可以通过AspectJ来做一些不那么神奇的事情。
fnvucqvd2#
如果你想以编程的方式进行堆转储,你在java.* 或javax.* 命名空间中找不到合适的API。但是,Sun运行时附带了HotSpotDiagnosticMXBean,它允许你通过将堆的内容写入磁盘中的指定文件来进行堆转储。
pw9qyyiw3#
我建议您进行堆转储,然后使用the Eclipse Memory Analyser检查它。您可以使用可用的视图追溯到例程层,查看对象属性。您甚至可以使用OQL和类似SQL的对象查询语言来查询对象。下面屏幕截图中的左面板演示了如何检查字段值。screenshot http://img181.imageshack.us/img181/4013/dominatortreegrouped.png
OQL
3条答案
按热度按时间rsaldnfx1#
我会研究一下instrument包。插装你感兴趣的类,这样ctor就可以注册创建的示例。如果你不想使用java.lang.instrument,或者如果对象是通过你可以控制的东西(IoC容器或工厂)创建的,那么你可以通过AspectJ来做一些不那么神奇的事情。
fnvucqvd2#
如果你想以编程的方式进行堆转储,你在java.* 或javax.* 命名空间中找不到合适的API。但是,Sun运行时附带了HotSpotDiagnosticMXBean,它允许你通过将堆的内容写入磁盘中的指定文件来进行堆转储。
pw9qyyiw3#
我建议您进行堆转储,然后使用the Eclipse Memory Analyser检查它。
您可以使用可用的视图追溯到例程层,查看对象属性。您甚至可以使用
OQL
和类似SQL的对象查询语言来查询对象。下面屏幕截图中的左面板演示了如何检查字段值。
screenshot http://img181.imageshack.us/img181/4013/dominatortreegrouped.png