2011-11-12 33 views

回答

3

如果關閉-XX:-UseTLAB,則可以在前後檢查Runtime.freeMemory()。但是在局部變量的情況下,它們不會佔用堆空間(因爲它們使用堆棧),並且無法獲得它的大小。

然而,int是一個32位的標誌值,並且可以預期它會使用4個字節(或更多,這取決於JVM和堆棧對準等)

在C++中的sizeof爲指針有用算術。由於Java不允許這樣做,因此它不是有用的,可能是故意隱藏的,以避免開發人員擔心低級別細節。

+0

稍微超出我的深度。你能提供一個例子嗎?我真的不知道如何關閉-XX:-UseTLAB? – tetris11

+0

它是一個命令行選項,您可以在類名之前將它添加到命令行中。基本上,對象的大小不是你應該需要知道的。這可能對你很有意思,但我建議你不要擔心,除非你知道你有問題。在哪個原因中,我會使用一個分析器,並會給你實際的大小。 –

+0

@PeterLawrey - 查看鏈接問題以獲得更好的方式。 –

1

我相信沒有直接的方法來做到這一點。 @Peter Lawrey的建議可能是一個近似值。但是,您不能依賴計算對象大小,因爲可以在Object構建前後獲得可用內存之間的差異,因爲在其他線程中可能會出現大量其他的後臺分配情況。此外,垃圾收集器可能會啓動並釋放操作之間的一些內存。特別是,在多線程環境下依靠內存差異絕對不是解決方案。

1

C有一個sizeOf內部函數的唯一原因(函數?好的東西)是因爲他們需要手動內存管理和一些指針算術的東西。

有沒有必要在Java中有。另外,一個對象佔用多少內存是完全實現定義的,並且不能可靠地回答,但您可以通過分配大量相同的對象和平均值來嘗試一些統計數據 - 如果您遵守一些基本原則,這可以很好地工作,但那很無聊。

如果我們知道一些基本的瞭解我們的虛擬機,我們也可以只算內存,所以對於熱點:

  • 2%的目標
  • 開銷字的每個對象8字節對齊(即你必須湊足8的倍數)
  • 至少1個字變量,也就是說,即使你沒有任何變量的對象,就「浪費」 1個字

你也應該知道你的語言規範一點,因此T你明白爲什麼內部類有一個額外的引用而不是明顯的,爲什麼一個靜態的內部類沒有。

有點工作,但是一般來說這是一個毫無用處的事情 - 如果你擔心內存問題,你不應該使用ActionScript和Java,而是使用C/C++ - 你可能會得到相同的性能Java,但你通常會使用大約2倍的內存,而這樣做...