【Java】堆和棧

加班使我快樂!

點贊再看,養成習慣。

堆(Stack):

  1. 實際的對象被存儲在堆內存中
  2. 創建的對象放在堆內存中,堆內存中的對象不會隨着方法的結束而銷燬,只有當一個對象沒有任何引用變量引用它時,系統的垃圾回收器纔會在合適的時候回收它
  3. 堆內存中的東西都有一個地址值。
  4. 堆內存中的數據都有默認值:
    • 整數       默認爲0

    • 浮點數    默認爲0.0

    • 字符       默認爲 '\u0000'

    • 布爾       默認爲false

    • 引用類型   默認爲null         

        

棧(Heap):

  1. 對象的引用變量放在棧內存中
  2. 在所有方法中定義的局部變量放在棧內存中,隨着方法的執行結束,這個方法的內存棧自然銷燬
  3. 局部變量:方法的參數,或者是方法{}內部的變量
  4. 方法的運行一定要在棧當中運行

 

舉個例子:

一個數組的內存圖

方法區內保存的最主要的內容就是方法信息:方法名字、參數、返回值等等

將方法區main中的信息加載到棧內存,方法進棧。

變量array放在內存中。new出來的數組int[3]放在堆中,默認值爲0,地址值假設爲0x666,這個地址值會被賦值到左邊變量中。實際上變量中存放的就是地址值,我們可以根據這個地址值在堆內存中找到數組在堆內存中的位置。

這裏我改變了數組中的值,array[1]=10,根據array找到array數組在堆內存中的位置,找到array[1],重新賦值爲10.

兩個數組的內存圖(同理)

兩個引用指向同一個數組的內存圖

拓展:

JVM內存的劃分有五片:
  1. 寄存器(pc Register):與CPU相關
  2. 本地方法棧(Native Method Stack):與操作系統有關
  3. 方法區(Method Area):存儲.class相關信息,包含方法的信息
  4. 棧內存
  5. 堆內存
爲什麼分爲五片?一片不行嗎?內存就好比我們住的房子,我們住的房子有臥室,有廚房,有廁所。如果房子裏面不分這麼多屋子也可以住,但是你想想,你在那邊做着飯,這邊有人在上廁所,這不就串味了了嗎?所以說還是分開好,它不串味!
發佈了150 篇原創文章 · 獲贊 94 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章