2012-04-24 32 views
1

是否可以獲取正在運行的Java應用程序的程序計數器(PC)寄存器值,特別是在Android模擬器中運行的程序計數器(PC)寄存器值?例如,gprof會隨機採樣PC寄存器值,以查找哪個函數正在消耗程序的運行時間。這樣的概念對於JVM是否有意義?爲了澄清,我希望程序計數器的實際值。Java程序的程序計數器寄存器值

另外,有沒有什麼方法可以測量「展開」代碼是如何在內存中?這可以通過查看objdump返回的地址範圍來在常規程序中進行測量。但是,這種方法並不處理共享庫的地址,這也是我在JVM環境中不理解的概念。

+0

由於Dalvik與普通的JVM差別很大,因此幾乎可以肯定不會有適用於這兩者的解決方案。 – 2012-04-24 09:54:38

回答

0

許多Java分析器如VisualVM都可以執行基於採樣的分析,這可能與您描述的相似。對於代碼內存的使用,這是垃圾回收器的「永久代」(PermGen)主要包含的東西; VisualVM也可以顯示。

+0

對於在原始問題中不夠清楚,我感到抱歉;我實際上希望程序計數器的值能夠了解程序佈局的擴展。理想情況下,我也希望獲得PC值的直方圖。 – arunchaganty 2012-04-24 10:53:17

+0

@arunchaganty:看看JVMTI API:http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html - 如果它不在那裏,你不能這樣做。但是用Java來達到這個水平通常沒什麼意義。 – 2012-04-24 11:26:46

+0

@Micheal謝謝你的參考。 「jlocation」格式顯然可以對應於本地機器位置。它看起來像'GetFrameLocation'可能會提供相關信息。爲了獲得這些信息,我需要編寫自己的工具嗎? – arunchaganty 2012-04-24 11:31:55