JVM運行時數據區

原文地址:xeblog.cn/articles/25線程

程序計數器(線程私有)

它是一塊較小的內存空間,能夠看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型裏,字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴這個計數器來完成。它是惟一一個在 JVM 規範中沒有規定任何 OOM 狀況的區域。code

Java虛擬機棧(線程私有)

它描述的是 Java 方法執行的內存模型:每一個方法在執行的同時都會建立一個棧幀用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。每個方法從調用到執行完成的過程,就對應着一個棧幀在虛擬機中入棧到出棧的過程。在 JVM 規範中對這個區域規定了兩種異常狀況:cdn

  • 若是線程請求的棧深度大於虛擬機所容許的深度,將拋出 StackOverflowError 異常。
  • 若是虛擬機棧能夠動態擴展,若是擴展時沒法申請到足夠的內存,就會拋出 OutOfMemoryError 異常。

本地方法棧(線程私有)

它和虛擬機棧所發揮的做用是很是類似的,它們之間的區別不過是虛擬機棧爲虛擬機執行 Java 方法(也就是字節碼)服務,而本地方法棧則爲虛擬機使用到的 Native 方法服務。對象

Java堆(線程共享)

對於大多數應用來講,Java堆JVM 所管理的內存中最大的一塊,它是被線程共享的一塊內存區域。在虛擬機啓動時建立此內存區域的惟一目的就是存放對象的實例,幾乎全部的對象實例都在這裏分配內存。Java堆 是垃圾收集器管理的主要區域(GC堆)。若是在堆中沒有內存完成內存分配,且堆也沒法再擴展時,將會拋出 OOM 異常。blog

方法區(線程共享)

它和 Java堆 同樣,也是各個線程共享的內存區域。它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據。當方法區沒法知足內存分配需求時,將會拋出 OOM 異常。接口

運行時常量池

它屬於方法區的一部分。Class 文件中除了有類的版本字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯期生成的各類字面量和符號引用,這部份內容將在類加載後進入方法區的運行時常量池中存放。內存

參考

  • 《深刻理解Java虛擬機:JVM高級特性與最佳實踐 第二版》
相關文章
相關標籤/搜索