2013-12-20 42 views
1

我想弄清楚Java結構/如何爲對象分配內存。 (是的,這是特定於實現的,我爲此使用了Oracle 1.7運行時。)我在這個herehere上做了一些工作,結果很混亂。Java如何爲對象的成員構造內存?

首先,在兩個引用的鏈接中,當我分配一個對象數組時,相當於新的Object [10000],它使用了每個對象4個字節。在32位系統上,這非常合理。但是我在64位系統上,所以這裏發生了什麼?

  1. 是Java的限制在32位地址空間,即使在64位系統?
  2. Java是否限於每個數組的32位地址空間,並且每個數組對象都有一個指向元素所在的指針?
  3. 還有別的嗎?

二,I compared the memory footprint of 8 booleans vs. a byte as the variables in a class。 8個布爾值需要24個字節/對象或3個字節/布爾值。單字節方法需要10個字節/對象。

  1. 3字節/布爾值是怎麼回事?我會理解4(使每個int),並明確1(使每個字節。但3?
  2. 什麼是擴展一個字節到10個字節?我會明白8它擴展一個字節本地int(I在64位的系統上「M),但與其他2個字節是什麼?

而且在different ways to create a RGB class it gets really weird的情況。

  1. 對於3個字節變量組成的類,它使用24個字節/實例。昂貴但易於理解,因爲每個使用int。
  2. 所以我試着每個類是一個單一的int w將int存儲在部分int中(使用位移)。而且它仍然是24字節/實例。爲什麼Java需要3個存儲空間?這沒有意義。
  3. 但最奇怪的情況是類中有一個變量「byte [] color = new byte 3;」請注意,字節被分配,所以它不只是一個空指針。這種方法比其他兩種方法佔用更少的內存。怎麼樣???

任何有關這裏發生的事情的指導,我們都很感激。我有一些分配很多的類,並且飛輪模式將不起作用(這些對象的值會在整個地方改變)。

和一個相關的問題,是否聲明變量的順序很重要?早在我進行C++編程時,聲明「int,byte,int,byte」使用了4 int的空間工作,而使用了「int,int,byte,byte」3.

+1

Java Runtime同時有64位和32位版本。 – OmniOwl

+0

不指定內存如何實際使用的好處是,你可以有不同的方式來做到這一點。相關:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html(64bit vm中的32位指針) – zapl

回答

1

有太多問題在這裏,但我會解決其中兩個。

即使在64位系統上,Java是否僅限於32位地址空間?

32位Java限於32位地址空間。 64位Java不是。

Java是否限於每個數組的32位地址空間,然後每個數組對象都有一個指向元素所在的指針?

一個Java數組被索引爲32位的int

0

瞭解你是在一個64位系統,但你運行一個32位或64位jvm? JVM本身對影響測試結果的許多優化有影響。有許多JVM(儘管只有少數JVM是受歡迎的),有些可能會有比其他更好或不同的優化。

相關問題