[英]Java instance variable of a static method
靜態方法的實例變量何時在Java中獲取內存? 在靜態方法中創建實例變量是完全正確的(在參數中或在函數內部聲明),但是我想知道靜態方法的實例變量何時分配內存,如果沒有創建該類的對象?
其實我是說靜態方法里面的局部變量
首先, instance variable
一詞不准確,我假設您在下面的示例中詢問諸如a
和b
類的local variable
:
void method(int a) {
int b = 3;
}
在Java中,只有原語和引用存儲在堆棧中,而對象在構造時存儲在堆中。 范圍一結束,堆棧將被清除,垃圾收集器將清除堆。
這是一個例子:
public class Main {
static A a = new A();
static void method() {
int b = 2;
C c = new C();
}
}
您的代碼第一次引用Main
,類加載器將加載該類並初始化其所有靜態字段-對象new A()
將進入堆。 這里什么也沒有發生,方法method
也可能不存在。
當您調用method method
,它將在堆棧上添加值2
,然后在堆棧上添加引用c
,該引用將指向堆中的對象new C()
。
當method存在時,將2
和c
從堆棧中刪除(實際上沒有刪除,但是堆棧的頂部更改為下面的兩個位置,因此無論何時有其他東西進入堆棧,這兩個值都將被覆蓋),而new C()
將保留在堆中,直到垃圾回收器觸發為止。 由於GC可能檢測到不再有對該對象的引用,因此可能會立即對其進行垃圾回收。
如果在靜態方法中聲明變量或使用參數,則根本不是實例變量。 它是一個局部變量,方法被調用后將被初始化
static void methodTest(int i) {
String s = "Hello";
}
s
是該方法的局部變量。 i
是函數參數,它也是方法的局部變量
靜態方法中沒有實例變量之類的東西。
如果您指的是參數和局部變量,則它們將分配在堆棧上(所有創建的對象將照常分配在堆上)。
類的靜態字段將在加載類時初始化。
構造實例時,將分配(並可能初始化)類的實例變量。
靜態方法定義的變量仍然是方法范圍內的局部變量,就像非靜態方法創建的局部變量一樣。 但是,問題在於,只要不卸載類加載器(通常是主類,僅在運行時終止時才“卸載”該類,就像用左手抓撓左耳一樣),該變量就永遠不會被垃圾回收集。 而且,只有在不再引用對象的情況下,對象才會獲得GC,並且在靜態字段的情況下,即使由於我描述的行為而沒有使用它們,它們也傾向於被引用。 因此,在存在內存和資源問題的大型應用程序中,在靜態方法中聲明任何內容是一個絕妙的主意,因為您很快就會用無法收集的局部變量來污染內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.