標籤:指令 java虛擬機器 效果 理解 恢複 ram png ges 收集
本內容由《深入理解java虛擬機器》的部分讀書筆記整理而成,本讀者計劃連載。
通過如和文字介紹來瞭解幾個運行時資料區的概念。
方法區:它是各個線程共用的地區,用於記憶體已被VM載入的類資訊、常量、靜態變數、即時編譯器編譯的代碼等資料。JVM規範對這個地區的限制很寬鬆,如同堆一樣不需要連續的記憶體、可選擇固定大小、可擴充的大小外,還可以選擇不實現垃圾收集。因為在些地區的垃圾收集必要性不高且效果較差。如果回收也是常量池的回收和類型的卸載,但此操作異常困難。當方法區無法滿足記憶體的分配時,拋OutOfMemoryError。
java堆:它是VM中所管理的最大的一塊線程共用的記憶體。它唯一的目的就是存放對象。JVM規範中描述為所有對象及數組都要存放於此。但是由於技術的發展也並不絕對。它也是垃圾收集器管理的最主要的地區。可以被分為:新生代和老年代等其劃分,這樣的目的只是便於劃分和回收記憶體。JVM規範描述為它可以是物理上不連續但邏輯上必須連續的地區。如果堆存無法再擴充時拋OutOfMemoryError。
JAVA 虛擬機器棧:它的生命同期與線程相同,因為它是描述java方法的記憶體模型,每個方法被執行時都會建立一個棧幀(stack frame)用於存放局部變數表、操作棧、動態連結、方法出口等資訊。每個方法從開始執行到執行完成都是一個棧幀在虛擬棧中入棧到出棧的過程。在些地區中有兩種異常狀況:如果線程請求棧嘗試大於虛擬機器所允許的深度,將拋出StackOverflowError;如果VM可以動態擴充,當擴充時無法申請到足夠的記憶體時拋OutOfMemoryError。
本地方法棧:它與java虛擬機器棧相似,區別是虛擬機器棧為虛擬機器執行java方法服務,而本地方法棧則是為虛擬機器使用到的Native方法服務。虛擬機器規範中對該地區中的方法使用的語言、方式、資料結構沒有強制規定,具體的虛擬機器可以自由實現它,比如 sun HotSpot 直接到本地方法棧和虛擬機器棧合二為一。拋出的異常與虛擬機器相同。
程式計數器:是一塊較小的記憶體空間,它的作用可看成是當前線程執行的位元組碼的行號指標。因為jvm的多線程是通過線程輪流切換並分配 處理器執行時間的方式來實現的,在任一時刻一個處理器只會執行一條線程中的指令。因為為了線程切換後能恢複到正確的執行位置,每個線程都要有一個獨立的程式計數器。
java記憶體地區——深入理解JVM讀書筆記