java虛擬機在運行的時候會把內存分爲不一樣的區域,每一個區域都有其特定額用途。java虛擬機運行數據區如圖所示。java
一、程序計數器 數組
是一塊較小的內存空間,是當前線程所執行的字節碼的行號指示器。若是線程正在執行一個java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;若是是Naive方法,則計數器爲空;這個區域不會出現OUtOfMemoryError異常。多線程
java虛擬機多線程是使用線程輪流切換並分配處理執行時間的方式來實現的,在任何一個肯定的時刻,一個處理器都只會執行一條線程中的指令。爲了線程切換後可以恢復到正確的執行位置,每條線程都須要一套獨立的線程計數器,這些計數器之間相互獨立,獨立存儲,這個內存區域爲「線程私有」。spa
二、java虛擬機棧線程
java虛擬機棧也是線程私有,與線程的生命週期一致,在執行每一個方法都會建立一個Stack Frame。每個方法從開始執行到結束,對應一個Stack Frame在虛擬機值棧中從入棧和出棧的過程。若是線程請求的棧深度大於虛擬機所容許的深度,就會出現StackOverFlowException。若是容許動態擴展,在擴展的過程當中,若是沒法申請到足夠的內存,則會拋出OutOfMemoryException異常。對象
三、本地方法棧blog
和java虛擬機棧的做用相似,不一樣點在本地方法棧主要是爲虛擬機使用到的Native方法提供服務,本地方法棧也會拋出StackOverFlowException和OutOfMemoryException異常。生命週期
四、java堆內存
堆是java虛擬機中內存中最大的一塊,被全部線程共享的一塊內存區域,在虛擬機建立時建立。做用就是存放對象實例,全部的對象的實例都須要在這裏分配內存。幾乎全部的對象實例和對象數組都須要在堆上分配。是java虛擬機內存回收的管理的重要區域,所以也被稱爲「GC」堆,能夠被分爲:新生代和老年代;Eden空間、From Survivor空間、To Survivor空間。若是堆中沒有內存完成實例分配,而且堆也沒法擴展時,則拋出OutOfMemoryException異常開發
五、方法區
方法區和java堆同樣,是各個線程共享的內存區域,用於存儲被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯的代碼等數據。一般被開發人員成爲「永久帶」。這個區域的內存回收的目標就是針對常亮池的回收和對類型的卸載,也是較爲難處理的部分。