這段時間對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語言實現的。