[英]Is a Java array of primitives stored in stack or heap?
我有一個這樣的數組聲明:
int a[];
這里a
是一個原始int
類型的數組。 這個數組存儲在哪里? 它是存儲在堆上還是棧上? 這是一個原始類型int
,所有原始類型都不存儲在堆上。
正如gurukulki 所說,它存儲在堆上。 但是,您的帖子暗示了一個誤解,可能是由於一些善意的人傳播了“原始人總是生活在堆棧上”的神話。 這是不真實的。 局部變量在堆棧上有它們的值,但並非所有原始變量都是局部變量......
例如,考慮一下:
public class Foo
{
int value;
}
...
public void someOtherMethod()
{
Foo f = new Foo();
...
}
現在, f.value
住在哪里? 神話表明它在堆棧上 - 但實際上它是新Foo
對象的一部分,並且存在於堆1上。 (請注意, f
本身的值是一個引用,並且存在於堆棧中。)
從那里開始,數組是一個簡單的步驟。 您可以將數組視為許多變量 - 所以new int[3]
有點像擁有這種形式的類:
public class ArrayInt3
{
public readonly int length = 3;
public int value0;
public int value1;
public int value2;
}
1事實上,它比這更復雜。 堆棧/堆的區別主要是實現細節 - 我相信一些 JVM,可能是實驗性的,可以判斷對象何時永遠不會從方法中“逃脫”,並且可以在堆棧上分配整個對象。 但是,如果您選擇關心,它在概念上是在堆上的。
它將存儲在堆上
因為數組是java中的一個對象。
編輯:如果你有
int [] testScores;
testScores = new int[4];
將此代碼想象為對編譯器說:“創建一個包含四個 int 的數組對象,並將其分配給名為testScores
的引用變量。此外,繼續將每個int
元素設置為零。謝謝。”
它是一組原始類型,其本身不是原始類型。 一個好的經驗法則是,當涉及新關鍵字時,結果將在堆上。
我只是想分享一些我在這個主題上運行的測試。
大小為 1000 萬的數組
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
輸出:
------------------------
max mem = 130.0 MB
total mem = 85.0 MB
free mem = 83.6 MB
used mem = 1.4 MB
------------------------
------------------------
max mem = 130.0 MB
total mem = 130.0 MB
free mem = 48.9 MB
used mem = 81.1 MB
------------------------
如您所見,使用的堆大小增加了約 80 MB,即 10m * sizeof(double)。
但是如果我們使用 Double 而不是 double
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
輸出將顯示 40MB。 我們只有雙重引用,它們沒有被初始化。
用 Double 填充它
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
Double qq = 3.1d;
for (int i = 0; i < a.length; i++) {
a[i] = qq;
}
memInfo();
}
還是40MB。 因為它們都指向同一個 Double 對象。
用 double 代替初始化
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
Double qq = 3.1d;
for (int i = 0; i < a.length; i++) {
a[i] = qq.doubleValue();
}
memInfo();
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
線
a[i] = qq.doubleValue();
相當於
a[i] = Double.valueOf(qq.doubleValue());
這相當於
a[i] = new Double(qq.doubleValue());
由於我們每次都會創建新的 Double 對象,因此我們會炸毀堆。 這表明 Double 類中的值存儲在堆中。
在 Java 編程語言中,數組是對象,是動態創建的,並且可以分配給 Object 類型的變量。
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
我想有兩種看待它的方式,當我們做這樣的事情時
int arr[] = new int[4];
for( int i=0;i<=3;i++ ){
arr[i] = i*10;
}
比我認為數組存儲在堆中,只有引用 ariable“arr”存儲在堆棧中。 但是當我們做這樣的事情時int arr[] = {10,20,30,40,50};
然后一切都存儲在堆棧中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.