可能重複:
In Java, what is the best way to determine the size of an object?Java:找出對象的內存大小?
在ActionScript我通常只是做:
var myVar:uint = 5;
getSize(myVar)
//outputs 4 bytes
如何做到這一點在Java中?
可能重複:
In Java, what is the best way to determine the size of an object?Java:找出對象的內存大小?
在ActionScript我通常只是做:
var myVar:uint = 5;
getSize(myVar)
//outputs 4 bytes
如何做到這一點在Java中?
如果關閉-XX:-UseTLAB
,則可以在前後檢查Runtime.freeMemory()。但是在局部變量的情況下,它們不會佔用堆空間(因爲它們使用堆棧),並且無法獲得它的大小。
然而,int
是一個32位的標誌值,並且可以預期它會使用4個字節(或更多,這取決於JVM和堆棧對準等)
在C++中的sizeof
爲指針有用算術。由於Java不允許這樣做,因此它不是有用的,可能是故意隱藏的,以避免開發人員擔心低級別細節。
稍微超出我的深度。你能提供一個例子嗎?我真的不知道如何關閉-XX:-UseTLAB? – tetris11
它是一個命令行選項,您可以在類名之前將它添加到命令行中。基本上,對象的大小不是你應該需要知道的。這可能對你很有意思,但我建議你不要擔心,除非你知道你有問題。在哪個原因中,我會使用一個分析器,並會給你實際的大小。 –
@PeterLawrey - 查看鏈接問題以獲得更好的方式。 –
我相信沒有直接的方法來做到這一點。 @Peter Lawrey的建議可能是一個近似值。但是,您不能依賴計算對象大小,因爲可以在Object構建前後獲得可用內存之間的差異,因爲在其他線程中可能會出現大量其他的後臺分配情況。此外,垃圾收集器可能會啓動並釋放操作之間的一些內存。特別是,在多線程環境下依靠內存差異絕對不是解決方案。
C有一個sizeOf內部函數的唯一原因(函數?好的東西)是因爲他們需要手動內存管理和一些指針算術的東西。
有沒有必要在Java中有。另外,一個對象佔用多少內存是完全實現定義的,並且不能可靠地回答,但您可以通過分配大量相同的對象和平均值來嘗試一些統計數據 - 如果您遵守一些基本原則,這可以很好地工作,但那很無聊。
如果我們知道一些基本的瞭解我們的虛擬機,我們也可以只算內存,所以對於熱點:
你也應該知道你的語言規範一點,因此T你明白爲什麼內部類有一個額外的引用而不是明顯的,爲什麼一個靜態的內部類沒有。
有點工作,但是一般來說這是一個毫無用處的事情 - 如果你擔心內存問題,你不應該使用ActionScript和Java,而是使用C/C++ - 你可能會得到相同的性能Java,但你通常會使用大約2倍的內存,而這樣做...
謝謝,我確實看到之前我問 - 但我認爲Java可能有它自己的方法。我不想爲快速查詢創建一個全新的班級 – tetris11