當乙個class檔案被classloader load進入jvm後,方法指令儲存在stack中,此時heap區沒有資料。然後程式技術器開始執行指令,如果是靜態方法,直接依次執行指令**,當然 此時指令**是不能訪問heap資料區的;如果是非靜態方法,由於隱含引數沒有值,會報錯。因此在非靜態方法執行前,要先new物件,在heap中分配數 據,並把stack中的位址指標交給非靜態方法,這樣程式技術器依次執行指令,而指令**此時能夠訪問到heap資料區了。
當乙個class被classloader load進入jvm之後,方法指令儲存在stack中,此時heap區沒有資料。然後程式計數器開始執行指令,如果是靜態方法,那麼直接一次執行指令**。若是非靜態方法,由於隱含的要傳入引數沒有值,那麼訪問的話就會報錯。故在非靜態方法執行前,要先new物件,在heap中分配物件,此時方可訪問heap資料區。
前面提到物件例項以及動態屬性都是儲存在heap中的,而heap必須通過stack中的位址指標才能夠被指令(類的方法)訪問到。因此可以推斷出:靜態 屬性是儲存在stack中的(基本型別儲存在stack中,物件型別位址儲存在stack,值儲存在heap中),而不同於動態屬性儲存在heap中。正 因為都是在stack中,而stack中指令和資料都是定長的,因此很容易算出偏移量,也因此不管什麼指令(類的方法),都可以訪問到類的靜態屬性。也正 因為靜態屬性被儲存在stack中,所以具有了全域性屬性。
物件例項以及非靜態屬性都是儲存在heap中,而heap必須通過stack中的位址指標才能被指令訪問到。因此:靜態屬性儲存在stack中,非靜態屬性儲存在heap中。
JAVA中的堆和棧
堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...
JVM學習之堆和棧
j a棧與堆 1.棧 stack 與堆 heap 都是j a用來在ram中存放資料的地方。與c 不同,j a自動管理棧和堆,程式設計師不能直接地設定棧或堆。2.棧的優勢是,訪問速度比堆要快,僅次於直接位於cpu中的暫存器。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。另外,棧資料可以...
Java中堆和棧的區別
堆 是大家共有的空間,分全域性堆和區域性堆。全域性堆就是所有沒有分配的空間,區域性堆就是使用者分配的空間。堆在作業系統對程序初始化的時候分配,執行過程中也可以向系統要額外的堆,但是記得用完了要還給作業系統,要不然就是記憶體洩漏。棧 thread safe 的。每個 物件的資料成員也存在在棧中,每個函...