2010-08-31 14 views
2

可能重複:
Is there any sizeof-like method in Java?如何計算java中類的大小??是c中的sizeof()之類的任何方法嗎?

我希望確定在運行時我班的規模。在C我這樣做:

struct 
{ 
int id; 
char name[30]; 
} registry 


void main() 
{ 
int size = sizeof(registry); 
} 

我怎麼能在Java中做到這一點?

+1

那就是物體的大小吧?不是類的大小(使用方法定義的字節碼等) – Thilo 2010-08-31 04:51:39

+1

你想用數字做什麼?可能有辦法做到你想要的,而不必知道明確的大小... – 2010-08-31 04:53:27

+0

可能自Java 5使用java.lang.instrument.Instrumentation – 2010-08-31 05:27:13

回答

1

你不行。 Java虛擬機不希望你知道它。

您可能還有其他方法可以處理您真正想要處理的信息。

+0

雅我想知道如何計算 – 2010-08-31 05:19:56

+0

這種措辭的措辭聽起來很奇怪對我來說。這聽起來像是他們只是在說謊而已! :-)我會說:JVM設計說JVM實現者可以執行優化,這是通過不需要公開對象的'大小'(或者甚至每個對象或者隨着時間的推移而不斷變化)來實現的。 – Ken 2010-08-31 05:56:40

1

虛擬機在內部存儲變量等方面存在差異。儘管大多數現代32位虛擬機類似。你可以估計這樣一個類實例的淺層大小:

sizeInBytes = C + 4 * (fieldCount) 

其中C是某個常數。

這是因爲通常所有字段都有一個字寬,對於JVM來說內部通常仍然是4個字節。該類的深度尺寸更難以計算,但基本上是遞歸地添加每個指示對象的尺寸。對於布爾值和字節,陣列通常爲1*arr.length字節,字符和短語爲2*arr.length,整數和浮點數爲4*arr.length,雙倍和長度爲8*arr.length

在運行時獲取估計值的最簡單方法可能是在實例化類的對象時測量Runtime.freeMemory()如何更改。當然,這些都不應該用於程序邏輯。只是爲了JVM調整或好奇。

+0

HotSpot虛擬機中的'boolean'實際上是8個字節,否則這一切都很好:) – Esko 2010-08-31 05:09:52

+0

@Esko'boolean'是八個__bytes__? – zneak 2010-08-31 05:22:37

+0

...位!該死的你,編輯時間到期和早上緩慢。 – Esko 2010-08-31 06:25:48

0

看看ClassMexer這只是新的java.lang.instrument.Instrumentation接口的簡單實現。只要按照說明,這很簡單。

它可能是太侵入你的使用,因爲它作爲javaagent運行,但從你的例子應該沒​​問題。

0

你可以得到一個估計,如果困難的話可以得到確切的數字。爲什麼有必要?

相關問題