我想研究Java程序的內存訪問模式。有沒有一個框架或我可以實現這一目標的方法。有沒有辦法找到Java程序訪問哪些內存地址以及按什麼順序訪問?
假設有一個程序P,它依次訪問內存地址m1,m2,m3等等。我希望能夠按照該順序查看這些訪問,並且如果可能,還可以訪問哪種類型的對象?
更新(添加對Durandal的建議):
我可以隨時通過PIN儀器運行Java程序查找內存訪問模式。除了這樣做,這一切都很好,我將失去內存地址映射到對象。我想要做的研究的一個重要方面是能夠將內存使用情況與相應類型(Class)進行映射。
儘管正確地提到內存使用模式將取決於JVM實現,但我想將其作爲研究的後續步驟。現在,我正在尋找字節碼工具。 (糾正我,如果我走錯了方向!)
我怎麼認爲字節碼檢測將幫助我分析緩存使用情況? 之前有任何解釋!這只是我想要做的一個方面。當內存訪問模式(如從PIN或修改的虛擬機或其他)獲得的信息不足以向我提供有關不同對象(或屬於特定類的對象)使用緩存的信息時, 。假設我得到字節碼訪問爲
ObjectA
ObjectB
ObjectC
...
很容易找到對象的大小。如果這是對象的第一次訪問,我還可以查找對象的內存訪問是否爲內存分配。然後,假設JVM在運行時會分配連續內存,我可以假設緩存的使用情況(通過運行緩存模擬)。現在,這不是一個很好的假設,但仍然給我緩存使用的上限(至少我相信如此)。
你爲什麼要這樣做?你會如何使用這些信息?我問的原因是,似乎你應該以另一種方式去做。 – 2012-07-23 09:27:52
如果我在某些基準測試中得到這個內存跟蹤,那麼我可以將它用於幾個目的,例如通過Java程序查找物理內存的生成使用模式,緩存使用情況等。然後我想探索改進的可能性,特別是併發程序的緩存。由於內存跟蹤很容易通過PIN儀器獲得,因此已經針對C/C++進行了此類研究。我想爲Java字節碼做類似的研究。 – Ankit 2012-07-23 16:11:23
字節碼是針對虛擬機的。因此它沒有字節碼中的高速緩存或存儲位置。這用於生成本機代碼,但是這個本機代碼可以在應用程序的整個生命週期內被多次編譯。此外,對象可以在程序的整個生命週期中移動到多個位置,因此其地址不是很有意義。 – 2012-07-23 16:39:26