簡體   English   中英

Java 基元數組是存儲在堆棧還是堆中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM