簡體   English   中英

運行時與java中的編譯時內存分配

[英]Runtime vs compile time memory allocation in java

關於java中的內存分配是在運行時還是編譯時發生,我感到很困惑。

例如:

class Test{
  int a;
  public Test(){
    a=10;
  }
};

// somewhere else
Test t = new Test();

a在運行時或在編譯時分配的? 如果在編譯時,如果java在直接獲取編譯的.class文件的VM上運行,那怎么可能呢?

也:

  • a分配值10

  • 它如何用於參考變量t

謝謝。

編譯時不會發生內存分配。 僅在加載和運行時。

編譯時會生成.class文件。

請記住,您需要有一個主類來運行該程序。 使用帶有classpath到.class文件的Java運行程序時,會出現加載和鏈接等步驟,

類加載器將文件加載到permgen。

當調用main方法時,將創建堆棧並將局部變量放在那里

當運行時遇到new時,它會在堆上創建對象並在那里分配所需的內存,就像Test所需的內存一樣。

局部變量和方法參數(例如基元或引用)在編譯時在概念上被分配在堆棧上的一個位置。

在運行時,無法保證能夠反映它在內存中的布局方式。

堆上對象的分配僅在運行時發生。

如何在VM上直接運行compile .class文件運行java。

只有VM知道如何編譯代碼,因此無法在編譯時進行內存分配。

when是指定值10

在分配發生的行。 鑒於它沒有被使用,JIT可以丟棄它,因此根本不會發生。

同樣的問題代表參考變量t。

t被指定在構造對象之后=位置。

嗯,這個有點像doozy,我不確定你是否會從這整個帖子中得到你想要的確切答案,因為真的,你所要求的,是一個主要的話語。編譯器的內部,大多數人真的不在乎。

在大多數情況下,Java編譯器使用自動內存管理,因此編譯器確定它將要或不會做什么,這可以在版本之間進行更改。

但在我開始解釋之前,我想澄清我的注意事項:

  1. 在引用非原始的Java對象時,我將使用[Object]。
  2. 在引用內存中具有值和標識符的位置時,我將使用[object]。
  3. 我將使用[primitive]來引用由Java中的一個基本類型組成的[object](int,double,float等,不包括字符串)
  4. String是java中的一個特例,雖然它是一個對象,但它的處理方式可能與其他對象不同。

    [object]具有特殊屬性。 它具有值和標識符,以及將標識符解析為值並在何時發生的過程取決於綁定的類型。

    存在靜態綁定,其中綁定可以在編譯時解析,並且其值或方法在編譯時是已知的。 這也稱為“早期”綁定。 例如。

    int a = 0; // AND //直接函數調用,如print();

    還有動態綁定,其中標識符和值或子程序之間的綁定直到運行時才能發生。 這也稱為“晚期”綁定。 例如。

    public void foo(java.util.List list){list.add(“bar”); }

    還有一種混合類型的綁定,但我不打算談論它,因為我沒有發現Java有它。

    現在,綁定也與范圍非常密切相關,范圍是變量“存在”某個范圍內的想法。 這是一個話題,我真的不想進入(范圍是一種熊),並使這篇文章成為小說而不是中篇小說。

    Java中內存分配的工作方式取決於以下幾點:

    1. 如果在編譯時已知對[Object],[object]或[primitive]的引用,並且可能發生靜態綁定,那么編譯器可能會為這些對象分配內存(注意我是怎么做的)在編譯時使用括號)。

    2. 如果在編譯時無法知道對[Object],[object]或[primitive]的引用,並且必須使用動態綁定,則編譯器可能會在運行時為這些對象分配內存。

    Java處理在運行時分配的對象的方式區分取決於使用哪種類型的綁定。

    1. 靜態綁定
      • 作為一種[Object]的對象將在編譯時將它們的引用放在堆棧上,但它們的內存在運行時分配在堆上。 (懶)。
      • 作為一種[primitive]的對象將在運行時綁定和分配。
      • 字符串是一種特殊情況,但通常像[對象]的情況一樣處理
    2. 后期綁定
      • 在運行時完成堆棧和堆上的分配。

    總之,不要擔心。 你這樣做很頭疼。

    如果我對此有任何不對,請有人告訴我。 我有點生疏了。

在java中,除非創建了在運行時創建的對象,否則不會加載類,因此任何成員變量(如“a”)都會在加載類時獲得空間。對於對象,它將在運行時分配空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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