How can I access Java heap objects without a reference?

随声附和 提交于 2019-12-03 21:47:16

问题


I would like to get a reference to all objects in the Java heap, even if I don't immediately have a reference to those objects in my active thread. I don't need non-referenced objects (those "queued" for garbage collection), but would like to get anything that's still in use.

The goal is to serialize and store all the objects to implement a poor-man's persistence of execution state. I realize that the rabbit hole goes deep when it comes to different types of transient state, but simply persisting objects & loaded class definitions would be useful to me.

Is there a way to access the heap in order to make this happen? Am I overlooking a more straightfoward approach?


回答1:


I'd look into the the instrument package. Instrument the classes you are interested in so the ctor registers the created instance. You might be able to do this via AspectJ should you not want to use the java.lang.instrument or if the objects are created via something you can control (an IoC container or factories) then you can do something a good chunk less magical.




回答2:


If you want to take a heap dump programmatically, you'll not find suitable APIs in the java.* or javax.* namespace. However, the Sun runtime comes with the HotSpotDiagnosticMXBean which will enable you to take a heap dump by writing the contents of the heap on to a specified file in disk.




回答3:


I suggest you take a heap dump and then inspect it using the Eclipse Memory Analyser.

The views available allow you to drill down to instance level, view object properties. You can even query objects using OQL - and SQL-like query language for objects.

The left panel in the below screenshot demonstrates inspecting field values.

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



来源:https://stackoverflow.com/questions/1384228/how-can-i-access-java-heap-objects-without-a-reference

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!