2016-09-14 51 views
3

我正在寻找一种方法来查找JVM中分配的对象列表。Java动态列出分配的对象

我不想使用探查器,因为我希望在代码本身内部在运行时看到这些对象。我想创建一个程序内存在的所有对象的图形以及相互之间的交互。

你有一个开始的方式?我已经搜索了很多反射类和剖析器的例子,但是找不到与我的案例有关的东西。

预先感谢您

+0

你看过垃圾收集器的源代码吗?每次收集未使用的对象时,它必须遍历对象的主列表。 –

+2

*“我想创建一个程序内存在的所有对象以及相互之间的交互作用的图形。”* - 这就是个人档案所做的事情。 – the8472

回答

1

你有一种方式开始?

是的,你可以采取堆转储和分析堆转储。

注意:使用已存在的堆分析器将是最简单的。例如visualvm,应用程序可以拥有数百万个对象,因此设计用于执行此操作的工具将帮助您导航数据。

+0

是的,但我希望它是实时(动态),所以我不想使用转储或分析器报告... – Jikai

3

您可以通过JVMTI实现此目的。 GetLoadedClasses功能是一个很好的切入点

JavaVM *jvm; 
jvmtiEnv *jvmti; 
jvmtiError err; 

env->GetJavaVM(&jvm); 
jvm->GetEnv((void **) &jvmti, JVMTI_VERSION_1_2); 

jint classCount = 0; 
jclass * classes; 

// get all classes loaded by jvm 
jvmti->GetLoadedClasses(&classCount, &classes); 

traverse heap,因而可以建立对象图。

+0

这看起来真的很强大,你知道如果有一个相当于Java?对于将来的版本,我希望将图形工具包含到Eclipse插件 – Jikai

+0

@Jikai中......您还可以在纯Java中构建工具代理,并尝试通过转换对象构造函数来跟踪分配情况[google](https:/ /github.com/google/allocation-instrumenter)。但这是非常不精确的方法,并且还需要'-javaagent:'参数(我也不确定可以用它构建整个堆图)。使用'jni/jvmti'你必须建立一个本地库(如果你希望你的项目是跨平台的话,每个平台实际上都是librart),但你仍然可以打包资源库并加载 – vsminkov