做爲一名 Java 語言的使用者,學習 JVM 有助於解決程序運行過程當中出現的問題、寫出性能更高的代碼。jvm
能夠說:學好 JVM 是成爲中高級 Java 工程師的必經之路。性能
有感於從未整理概括 JVM 相關的知識,因此打算寫一系列 JVM 相關的文章,以加深鞏固習得成果,爲後續遺忘提供快速找回之途徑。學習
Java 虛擬機 (簡稱JVM,Java Virtual Machine) ,是運行 Java 程序的平臺,準確來講,是運行字節碼的平臺。操作系統
Java 爲達成
Write Once, Run Everywhere
的目標,對於不一樣操做系統有不一樣的虛擬機實現,使用class 字節碼做爲中間碼,JVM 執行字節碼完成程序功能。.net
程序計數器(Program Counter Register)是一小塊線程私有的內存區域,生命週期與線程相同,可看做是當前線程執行字節碼的行號指示器。是 JVM 中惟一一個不會出現 OOM(OutOfMemeryError)的區域。線程
若是線程執行的是一個 Java 方法,計數器記錄的是正在執行的虛擬機字節碼指令的地址;
若是執行的是一個 Native 方法,則計數器值爲空。code
虛擬機棧(Virtual Machine Stack)是線程私有的內存區域,生命週期與線程相同,描述着Java方法執行的內存模型:每一個方法在執行時都會建立一個棧幀(Stack Frame)用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。每一個方法執行完成就對應着銷燬這個棧幀,即出棧。對象
此區域只會出現兩種異常:blog
本地方法棧(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的基本概念與其運行時數據區內存的內容。
參考
本文同步發佈於本人csdn