2016-09-14 78 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