echo編輯整理。歡迎添加echo微信(微信號:t2421499075)交流學習。歡迎轉載,轉載請聲明文章來源html
參考資料列表:java
Java虛擬機在執行Java程序的過程當中會把它所管理的內存劃分爲若干個不一樣的數據區域。這些區域有各自的用途,以及建立和銷燬的時間,有的區域隨着虛擬機進程的啓動而一直存在,有些區域則是依賴用戶線程的啓動和結束而創建和銷燬。根據《Java虛擬機規範》的規定,Java虛擬機所管理的內存將會包括如下幾個運行時數據區域,如圖 緩存
圖中方法區和堆屬於線程共享區域,程序計數器、本地方法棧和Java虛擬機棧是線程獨立隔離區域微信
程序計數器(Program Counter Register)是一塊較小的內存空間,它能夠看做是當前線程所執行的字節碼的行號指示器。在Java虛擬機的概念模型裏[插圖],字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的字節碼指令,它是程序控制流的指示器,分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴這個計數器來完成。因爲Java虛擬機的多線程是經過線程輪流切換、分配處理器執行時間的方式來實現的,在任何一個肯定的時刻,一個處理器(對於多核處理器來講是一個內核)都只會執行一條線程中的指令。所以,爲了線程切換後能恢復到正確的執行位置,每條線程都須要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,咱們稱這類內存區域爲「線程私有」的內存。若是線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;若是正在執行的是本地(Native)方法,這個計數器值則應爲空(Undefined)。此內存區域是惟一一個在《Java虛擬機規範》中沒有規定任何OutOfMemoryError狀況的區域。多線程
與程序計數器同樣,Java虛擬機棧(Java Virtual Machine Stack)也是線程私有的,它的生命週期與線程相同。虛擬機棧描述的是Java方法執行的線程內存模型:每一個方法被執行的時候,Java虛擬機都會同步建立一個棧幀[插圖](Stack Frame)用於存儲局部變量表、操做數棧、動態鏈接、方法出口等信息。每個方法被調用直至執行完畢的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。學習
本地方法棧(Native Method Stacks)與虛擬機棧所發揮的做用是很是類似的,其區別只是虛擬機棧爲虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是爲虛擬機使用到的本地(Native)方法服務。 線程
Java堆(Java Heap)是虛擬機所管理的內存中最大的一塊。Java堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立。此內存區域的惟一目的就是存放對象實例,Java世界裏「幾乎」全部的對象實例都在這裏分配內存。若是在Java堆中沒有內存完成實例分配,而且堆也沒法再擴展時,Java虛擬機將會拋出OutOfMemoryError異常。cdn
方法區(Method Area)與Java堆同樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯器編譯後的代碼緩存等數據。若是方法區沒法知足新的內存分配需求時,將拋出OutOfMemoryError異常。在棧深度溢出時拋出StackOverflowErrorhtm