我正在學習Java的過程中,我正在閱讀Head First Java書籍,並且我認爲它迄今爲止非常棒......但是,我真正想知道的一件事是對象從內存堆,你知道......比特,字節,kb等。這怎麼能做到?如何通過內存堆中的java對象獲取佔用的空間?
這是我在這裏的第一個問題...我希望不是一個愚蠢的問題,也對我的英語技能感到抱歉,謝謝。
我正在學習Java的過程中,我正在閱讀Head First Java書籍,並且我認爲它迄今爲止非常棒......但是,我真正想知道的一件事是對象從內存堆,你知道......比特,字節,kb等。這怎麼能做到?如何通過內存堆中的java對象獲取佔用的空間?
這是我在這裏的第一個問題...我希望不是一個愚蠢的問題,也對我的英語技能感到抱歉,謝謝。
這比僅僅使用空閒內存計算(沒有考慮垃圾收集和其他線程的新分配)要複雜得多。看一看:
http://www.javaspecialists.eu/archive/Issue142.html
這是先進的東西,但是。
- 編輯 -
溶液上方找到深大小的對象的(使用堆棧遍歷參考網絡,訪問引用的集合,當然儀器)。
然而,得到淺大小的物體的更簡單,並且可以通過Java 1.5的儀器而無需額外的工作來實現(見Instrumentation.getObjectSize())。
對象佔用的內存量從一個JVM實現到下一個,有時從一個平臺到另一個不同。
您可以通過計算聲明爲對象類的實例變量的原始類型和對象引用的數量和大小來估計數量。
例如:
public class Monkey {
int arms;
Animal parent;
}
..has 1對象引用和1個INT原始的,其上的32位體系結構將佔用每個實例大約 8個字節。
是的,我確實想到了這一點,但似乎太笨拙了,無論如何感謝 – 2010-07-20 22:52:15
我覺得現在太多了,皮特的答案對我有用。謝謝。 – 2010-07-20 22:57:05
我正在檢查皮特的答案鏈接的代碼,並注意到讀取instrumentation.getObjectSize()的行;我現在正在檢查Intrumentation類,再次感謝。 – 2010-07-22 18:08:08
有一點,Instrumentation是一個接口或像Math這樣的靜態類?你給我的鏈接說的是「公共接口Instrumentation」,但如果真的是它的一個接口,你將不得不編寫自己的getObjectSize()實現,對嗎? – 2010-07-22 18:50:03