JVM系列之一 JVM的基礎概念與內存區域

前言

做爲一名 Java 語言的使用者,學習 JVM 有助於解決程序運行過程當中出現的問題、寫出性能更高的代碼。jvm

能夠說:學好 JVM 是成爲中高級 Java 工程師的必經之路。性能

有感於從未整理概括 JVM 相關的知識,因此打算寫一系列 JVM 相關的文章,以加深鞏固習得成果,爲後續遺忘提供快速找回之途徑。學習

1、JVM 是什麼?

Java 虛擬機 (簡稱JVM,Java Virtual Machine) ,是運行 Java 程序的平臺,準確來講,是運行字節碼的平臺。操作系統

Java 爲達成 Write Once, Run Everywhere 的目標,對於不一樣操做系統有不一樣的虛擬機實現,使用class 字節碼做爲中間碼,JVM 執行字節碼完成程序功能。.net

2、JVM的內存區域

一、程序計數器

程序計數器(Program Counter Register)是一小塊線程私有的內存區域,生命週期與線程相同,可看做是當前線程執行字節碼的行號指示器。是 JVM 中惟一一個不會出現 OOM(OutOfMemeryError)的區域。線程

若是線程執行的是一個 Java 方法,計數器記錄的是正在執行的虛擬機字節碼指令的地址;
若是執行的是一個 Native 方法,則計數器值爲空。code

二、虛擬機棧

虛擬機棧(Virtual Machine Stack)是線程私有的內存區域,生命週期與線程相同描述着Java方法執行的內存模型:每一個方法在執行時都會建立一個棧幀(Stack Frame)用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。每一個方法執行完成就對應着銷燬這個棧幀,即出棧。對象

此區域只會出現兩種異常:blog

  • StackOverflowError:當申請的棧深度達到 JVM 容許的最大深度時拋出。
  • OutOfMemeryError:若是虛擬機棧可動態擴展,但申請不到足夠內存時拋出。

三、本地方法棧

本地方法棧(Native Method Stack)與虛擬機棧做用相似,也是線程私有的內存區域,區別在於運行的是本地方法(Native Method)。生命週期

本地方法,即非Java語言實現的方法,好比C,使用本地方法能夠擴充Java沒有的語言特性。

四、堆

堆(Heap)是線程共享的內存區域,是JVM管理中最大的內存區域,惟一做用就是存放對象實例是 JVM 垃圾收集的主要區域

五、方法區

方法區(Method Area)又名非堆(Non-Heap)是線程共享的內存區域,存儲着被 JVM 加載的類信息、常量、靜態變量、即時編譯器編譯後的二進制等數據

六、運行時常量池

運行時常量池(Runtime Constant Pool)是方法區的一部分,用於存放編譯期生成的字面量和符號引用,這部份內容將在類加載後進入方法區運行時常量池中存放。

七、直接內存

直接內存(Direct Memery)即經過native方法直接分配在堆外的內存。它不是JVM虛擬機運行時數據區的一部分,也不在JVM規範中定義,但這部份內存使用頻繁,也可能致使OOM。

總結

JVM 是一個運行着字節碼的平臺,其運行時數據區包含 程序計數器、虛擬機方法棧、本地方法棧、堆、方法區,前三者是線程私有(隔離)的,後二者是線程共享的。

以上就是JVM的基本概念與其運行時數據區內存的內容。

參考

  • 《深刻理解Java虛擬機 第2版》周志明著

本文同步發佈於本人csdn

相關文章
相關標籤/搜索