-
1 # 娃娃學軟體
-
2 # 菸草的香味
Java的記憶體區域被分為了:
程式計數器
本地方法棧
虛擬機器棧
方法區
堆
其中各作用如下:
1.虛擬機器棧
虛擬機器棧和執行緒是緊密聯絡的, 每建立一個執行緒就會對應建立一個Java棧, 生命週期和執行緒相同, 所有虛擬機器棧也是"執行緒私有"的記憶體區域.
這個棧中對應多個棧幀, 每呼叫一個方法就會往棧中建立並壓入一個棧幀, 棧幀是用來儲存方法資料和部分過程結果的資料結構, 每一個方法從呼叫到最終返回結果的過程, 就對應一個棧幀從入棧到出棧的過程.
執行緒執行過程中, 只有一個棧幀處於活躍狀態, 被稱為"當前活動幀棧", 當前活動幀棧始終是虛擬機器棧的棧頂元素.
2.本地方法棧
本地方法棧和虛擬機器棧的作用相似, 只是虛擬機器棧是為Java方法服務的, 而本地方法棧是為Native方法服務的.
3.堆
堆是儲存java例項或者物件的地方, 是GC的主要區域.
4.方法區
方法區是用來儲存類結構資訊(包括常量池、靜態變數、建構函式等)的地方, 型別資訊是由類載入器在類載入是從類檔案中提取出來的
5.程式計數器
程式計數器是JVM中一塊較小的記憶體區域, 儲存著當前執行緒執行的虛擬機器位元組碼指令的記憶體地址.
Java多執行緒的實現, 其實是透過執行緒間的輪流切換並分配處理器執行時間的方式實現的, 在任何時刻, 處理器都只會執行一個執行緒的指令. 在多執行緒場景下, 為了保證執行緒切換回來後, 還能恢復到原來的狀態, 找到原先執行的指令, 所以每個執行緒都會設立一個程式計數器, 並且各個執行緒之間互不影響, 程式計數器為"執行緒私有"的記憶體區域.
記憶體區域便如此劃分.
具體可以看我之前發的文章
《《JVM記憶體結構》》
https://www.toutiao.com/i6604297061430985219/
《《JVM垃圾回收》》(介紹了Java虛擬機器如何回收記憶體空間)
https://www.toutiao.com/i6604365296549495299/
回覆列表
java堆用來儲存物件。jvm只有一個堆區被所有執行緒所共享。FIFO先進先出。
java棧儲存基礎資料型別的物件和自定義物件的引用。每個執行緒包含一個棧區。FILO先進後出。
java方法區中包含的都是在整個程式中永遠唯一的元素。被所有的執行緒共享。