2009-12-15 32 views
4

像C語言編程,C++不會數組值存儲在而是保持在STACK的值。但在Java中,爲什麼有必要將數組值保存在堆中?爲什麼java中的數組值存儲在堆中?

+1

爲什麼它怎麼了你? JVM應該處理任何內存分配和釋放問題。具體來說,我認爲這取決於你有什麼類型的數組,主要是vs對象。 – Jay 2009-12-15 14:23:26

+1

@Jay。無論如何,它並不困擾我。但是我想知道爲什麼內存分配保存在堆中。這背後有什麼特別的原因嗎?多數民衆贊成在... – i2ijeya 2009-12-16 14:46:02

回答

16

在Java中,數組(就像所有其他對象)都通過引用傳來傳去:當你傳遞一個陣列的方法,它會得到指向內存中的相同位置的引用,沒有複製,正在取得進展。這意味着數組需要在創建它的方法後保持「活動」狀態,因此不能存儲在方法的堆棧框架中。它需要由垃圾收集器管理,就像所有其他對象一樣。

有一些研究正在使用「逃逸分析」來優化JVM內存分配:如果一個對象(如數組)可以保證永遠不離開當前範圍,事實上可以將其分配給堆棧,這是更高效。

6

短的回答是,在Java中的陣列是一個引用類型,和引用類型住在堆上。值得一提的是,在C#,一個可以切換到不安全模式和初始化用stackalloc陣列這將在棧上創建該陣列。因此,它是完全有可能的是,虛擬機將讓你做出在棧上的數組,它只是一個實現細節,這意味着陣列都生活在堆上。

+0

你的術語不是很精確。引用類型不會生活在堆上;這些引用類型引用的對象*存在於堆中。由於數組是Java中的一個對象,因此它存在於堆中。 – Jesper 2009-12-15 14:53:51

+0

非常正確。我使用「引用類型」和「值類型」符合.Net的用法,正如你所說的那樣,它不太精確。 – AlecZorab 2009-12-16 22:44:43

0
int[]a={10,20,30}; 

stack這個數組存儲,但下面的數組存儲在heap

`int[]num=new int num[2];`//here we build the object of array , object always located in heap 

總是像對待Java對象數組,所以不要的事實,數組不存儲在混淆當我們有一個像上面這樣的聲明時,公羊就會出現。

+0

我不認爲這是正確的。你的第一個例子是新的int [] {10,20,30}的簡寫,我的理解是數組將被存儲在堆上。 – darrenmc 2014-09-08 14:32:32