jvm-運行時數據區域

總覽

      在Java虛擬機規範(Java SE 7版)中,jvm內存區域劃分以下: java

  • 線程共享的區域有方法區和堆
  • 線程私有的區域有程序計數器,虛擬機棧,本地方法棧

詳解

  1. 程序計數器
          在單個線程中,指令的執行是有序的,程序計數器便可當作是字節碼執行行號指針。若是正在執行的是一個java方法,這個計數器記錄的是當前執行字節碼指令的地址;若是執行的是一個native方法,這個計數器值爲underfined。
          此區域是在規範中惟一沒有定義OutOfMemoryError的區域。算法

  2. Java虛擬機棧
          虛擬機棧即咱們常說的堆棧中的棧,它是線程私有的,主要用來完成棧幀的入棧出棧操做和線程局部變量的保存,棧幀即方法運行時的基礎數據結構,具體內容包含局部變量表、操做數棧、動態連接、方法出口等,每一個方法從調用到完成對應着此棧幀在虛擬機棧中的入棧到出棧過程,棧大小在jdk1.8中默認爲 1024k,可經過 jinfo -flag ThreadStackSize pid 查詢,經過 -Xss1m 方式設置棧大小,棧大小設置關乎應用所能建立線程數量,應根據實際須要進行設置,在其餘條件相同的狀況下,棧幀大小與棧深度成反比。
          此區域有兩種異常情況:若是棧深度大於虛擬機定義深度,會拋出StackOverflowError異常;棧支持擴展,若是在擴展過程當中沒法申請足夠的內存,會拋出OutOfMemoryError。數據結構

  3. 本地方法棧
          本地方法棧爲虛擬機使用到的Native方法服務,本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。jvm

  4. Java 堆
          被全部線程共享的一塊區域,幾乎全部的對象實例都在這裏分配(如今存在棧上分配等優化技術),從垃圾回收的角度來講,基本都採用分代收集算法(除G1),因此java堆還能夠分爲:新生代(from survivor,to survivor,eden)、老年代。堆大小在jvm啓動時經過-Xmx、-Xms配置,當沒法爲實例分配足夠大的堆內存時,會拋出OutOfMemoryError異常。優化

  5. 方法區
          方法區也是全部線程共享,主要存儲類信息、常量、靜態變量、即時編譯器編譯後的代碼等,在使用hotspot的應用中常常也被稱爲永久代(Permanent Generation)。在方法區中有個很重要的組成部分是運行時常量池,用於存放編譯期生成的字面量和符號引用,當方法區沒法知足內存分配需求時,將拋出OutOfMemoryError。線程

相關文章
相關標籤/搜索