JVM性能調優之一JVM內存結構

   這段時間對JVM性能調優進行學習,爲了鞏固知識和加深理解,先對所學內容進行簡單的總結。

【JVM內存模型】

      JVM內存模型主要分爲:堆、程序計數器、方法區、虛擬機棧、本地方法棧。

      其中堆和方法區的內存是線程共享的。

1、堆內存(Heap)

  堆內存是JVM中最大一塊內存,改內存被所有線程共享。存儲內容 包括所有的對象和數組。

  堆內存分爲新生代、老年代、永久代(或元空間)。新生代有分爲Eden區和Survivor區,而Survivor又分爲From Survivor和To Survivor。

  jdk6永久代在非堆內存;jdk7永久代的靜態變量和運行時常量池合併到了堆中;jdk8永久代被元空間取代了。

   

2、程序計數器(program Counter Register)

   程序計數器是一塊很小的內存空間,主要用來記錄各個線程的字節碼地址,例如:分支、循環、異常、跳轉、線程回覆等都依賴於計數器。

    由於java是多線程語言,當執行的線程數大於cpu核數時,線程之間會根據時間片輪詢爭奪cpu資源。如果一個線程的時間片用完了,或者是其他原因導致這個線程的cpu資源提前被搶奪,那麼這個退出來的線程就需要單獨一個程序計數器,來記錄下一條運行的指令。

3、方法區(Method Area)

       方法區主要是用來存放已經被虛擬機加載的類相關信息。包括類信息、運行時常量池、字符串常量池。類信息包括類的版本、字段、方法、接口和父類等信息。

       JVM在執行某個類的時候,必須經過加載、連接、初始化。而連接又包括驗證、準備、解析三個階段。

 

4、虛擬機棧(VM stack)

     虛擬機棧用來保存方法的局部變量、操作數棧、動態連接方法和返回地址。

 

5、本地方法棧(Native Method Stack)

     本地方法棧和虛擬機棧功能類似,虛擬機棧管理java函數的調用(我理解就是自己寫的java方法)。

     本地方法棧用於管理本地方法的調用,本地方法不是java實現的,而是C語言實現的。

 

 

 

發佈了62 篇原創文章 · 獲贊 28 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章