程序計數器:安全
做用:記錄當前線程鎖執行到的字節碼的行號。字節碼解釋器工做的時候就是經過改變你這個計數器的值來選取下一條須要執行的字節碼指令。多線程
意義:JVM的多線程是經過線程輪流切換並分配處理器來實現的,對於咱們來講的並行事實上一個處理器也只會執行一條線程中的指令。因此,爲了保證各線程指令的安全順利執行,每一個線程都有獨立的私有的程序計數器。線程
存儲內容:當線程中執行的是一個Java方法時,程序計數器中記錄的是正在執行的線程的虛擬機字節碼指令的地址。當線程中執行的是一個本地方法時,程序計數器中的值爲空。對象
可能出現異常:此內存區域是惟一一個在JVM上不會發生內存溢出異常的區域。內存
虛擬機棧:編譯器
做用:描述Java方法執行的內存模型。每一個方法在執行的同時都會開闢一段內存區用於存放方法運行時所需的數據,稱爲棧幀,一個棧幀包括如:局部變量表、操做數棧、動態連接、方法出口等信息。虛擬機
意義:JVM是基於棧的,因此每一個方法從調用到執行結束,就對應着一個棧幀在虛擬機棧中入棧和出棧的整個過程。編譯
存儲內容:局部變量表(編譯期可知的各類基本數據類型、引用類型和指向一條字節碼指令的returnAddress類型)、操做數棧、動態連接、方法出口等信息。變量
值得注意的是:局部變量表所需的內存空間在編譯期間完成分配。在方法運行的階段是不會改變局部變量表的大小的。擴展
可能出現的異常:若是線程請求的棧深度大於虛擬機所容許的深度,將拋出StackOverflowError異常。若是在動態擴展內存的時候沒法申請到足夠的內存就會拋出OutOfMemoryError異常。
本地方法棧:
做用:爲JVM所調用的Nativa即本地方法服務。
可能出現的異常:和虛擬機棧出現的異常很相像。
Java堆:
做用::全部線程共享一塊內存區域,在虛擬機開啓的時候建立。
意義:存儲對象實例更好的分配內存;垃圾回收(堆是垃圾收集器管理的主要區域,更好的回收內存)
存儲內容:存放對象實例,幾乎全部的對象實例都在這裏進行分配。堆能夠處於物理上不連續的內存空間,只要邏輯上是連續的就能夠。
值得注意的是:在JIT編譯器等技術的發展下,全部對象都在堆上進行分配已變得不那麼絕對。有些對象實例也能夠分配在棧中。
可能出現的異常:實現堆能夠是固定大小的,也能夠經過設置配置文件設置爲可擴展的。若是堆上沒有內存進行分配並沒有法進行擴展時將會拋出OutOfMemoryError異常。
方法區:
做用:用於存儲運行時常量池、已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
意義:對運行時常量池、常量、靜態變量等數據作出了規定。
存儲內容:運行時常量池(具備動態性)、已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
可能出現的異常:當方法區沒法知足內存分配需求時,將拋出OutOfMemoryError異常。