[英]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編譯器使用自動內存管理,因此編譯器確定它將要或不會做什么,這可以在版本之間進行更改。
但在我開始解釋之前,我想澄清我的注意事項:
String是java中的一個特例,雖然它是一個對象,但它的處理方式可能與其他對象不同。
[object]具有特殊屬性。 它具有值和標識符,以及將標識符解析為值並在何時發生的過程取決於綁定的類型。
存在靜態綁定,其中綁定可以在編譯時解析,並且其值或方法在編譯時是已知的。 這也稱為“早期”綁定。 例如。
int a = 0; // AND //直接函數調用,如print();
還有動態綁定,其中標識符和值或子程序之間的綁定直到運行時才能發生。 這也稱為“晚期”綁定。 例如。
public void foo(java.util.List list){list.add(“bar”); }
還有一種混合類型的綁定,但我不打算談論它,因為我沒有發現Java有它。
現在,綁定也與范圍非常密切相關,范圍是變量“存在”某個范圍內的想法。 這是一個話題,我真的不想進入(范圍是一種熊),並使這篇文章成為小說而不是中篇小說。
Java中內存分配的工作方式取決於以下幾點:
如果在編譯時已知對[Object],[object]或[primitive]的引用,並且可能發生靜態綁定,那么編譯器可能會為這些對象分配內存(注意我是怎么做的)在編譯時使用括號)。
如果在編譯時無法知道對[Object],[object]或[primitive]的引用,並且必須使用動態綁定,則編譯器可能會在運行時為這些對象分配內存。
Java處理在運行時分配的對象的方式區分取決於使用哪種類型的綁定。
總之,不要擔心。 你這樣做很頭疼。
如果我對此有任何不對,請有人告訴我。 我有點生疏了。
在java中,除非創建了在運行時創建的對象,否則不會加載類,因此任何成員變量(如“a”)都會在加載類時獲得空間。對於對象,它將在運行時分配空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.