簡體   English   中英

靜態方法的Java實例變量

[英]Java instance variable of a static method

靜態方法的實例變量何時在Java中獲取內存? 在靜態方法中創建實例變量是完全正確的(在參數中或在函數內部聲明),但是我想知道靜態方法的實例變量何時分配內存,如果沒有創建該類的對象?

其實我是說靜態方法里面的局部變量

首先, instance variable一詞不准確,我假設您在下面的示例中詢問諸如ab類的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存在時,將2c從堆棧中刪除(實際上沒有刪除,但是堆棧的頂部更改為下面的兩個位置,因此無論何時有其他東西進入堆棧,這兩個值都將被覆蓋),而new C()將保留在堆中,直到垃圾回收器觸發為止。 由於GC可能檢測到不再有對該對象的引用,因此可能會立即對其進行垃圾回收。

如果在靜態方法中聲明變量或使用參數,則根本不是實例變量。 它是一個局部變量,方法被調用后將被初始化

static void methodTest(int i) {

String s = "Hello";

}

s是該方法的局部變量。 i是函數參數,它也是方法的局部變量

靜態方法中沒有實例變量之類的東西。

如果您指的是參數和局部變量,則它們將分配在堆棧上(所有創建的對象將照常分配在堆上)。

類的靜態字段將在加載類時初始化。

構造實例時,將分配(並可能初始化)類的實例變量。

靜態方法定義的變量仍然是方法范圍內的局部變量,就像非靜態方法創建的局部變量一樣。 但是,問題在於,只要不卸載類加載器(通常是主類,僅在運行時終止時才“卸載”該類,就像用左手抓撓左耳一樣),該變量就永遠不會被垃圾回收集。 而且,只有在不再引用對象的情況下,對象才會獲得GC,並且在靜態字段的情況下,即使由於我描述的行為而沒有使用它們,它們也傾向於被引用。 因此,在存在內存和資源問題的大型應用程序中,在靜態方法中聲明任何內容是一個絕妙的主意,因為您很快就會用無法收集的局部變量來污染內存。

暫無
暫無

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

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