JVM分為哪些區,每一個區干嘛的?


  • 程序計數器PC
  1. 線程私有
  2. 它可以看做是當前線程所執行的字節碼的行號指示器
  3. 內存區域中唯一一個沒有規定任何OutOfMemoryError的區域

 

  • Java虛擬機棧
  1. 線程私有
  2. 每個方法在執行的同時都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息
  3. 如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverFlowError異常;如虛擬機擴展時仍無法申請到足夠的內存,就會拋出OutOfMemoryError異常

 

  • 本地方法棧

         與虛擬機棧非常相似,區別是虛擬機棧為虛擬機執行Java方法服務,而本地方法棧則為虛擬機使用Native方法服務

         也會拋出StackOverFlowError和OutOfMemoryError異常

 

  • Java堆
  1. 線程共享
  2. Java堆是GC管理的主要區域
  3. 在虛擬機啟動時創建
  4. 存放對象實例,幾乎所有的對象實例數組都在這里分配內存。
  5. 如果在堆中沒有內存完成實例分配,並且堆也無法再擴展時,將會拋出OutOfMemoryError異常

 

  • 方法區
  1. 線程共享
  2. 用於存儲已被虛擬機加載的類信息、常量、靜態變量、即使編譯器編譯后的代碼等數據
  3. 當方法區無法滿足內存分配需求時,將拋出OutOfMemoryError異常

 

  • 運行時常量池
  1. 是方法區的一部分
  2. 用於存放編譯器生成的各種字面量和符號引用
  3. 相對於Class文件常量池的一個重要特征是,具備動態性
  4. 運行時常量池是方法區的一部分,自然受到方法區內存的限制。當常量池無法再申請到內存時會拋出OutOfMemoryError異常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM