JAVA系列-JVM
- 2020 年 3 月 26 日
- 筆記
1)JVM體系概述
JVM體系結構概覽
JVM參數調優及相關參數
JVM的參數類型
- 標配參數:java-version; java -help
- X參數:-Xint 解釋執行; -Xcomp 第一次使用就編譯; -Xmixed 混合模式(先編譯再執行)
- XX參數:
- Boolean類型:-XX:(+|-)屬性
- + 或者-某個屬性值; +表示開啟; -表示關閉
- eg: -XX:+PrintGCDetails
- kv設值類型:-XX:key=value
- 說明:鍵值對賦值
- eg: -XX:MetaspaceSize=128m; -XX:MaxTenuringThreshold=15
- 兩個經典參數:-Xms 和 -Xmx
- -Xms: 等價於-XX:InitialHeapSize
- -Xmx:等價於-XX:MaxHeapSize
- Boolean類型:-XX:(+|-)屬性
如果查看一個正在運行的java程式,是否開啟jvm參數是否開啟?具體值是多少?
jps -l jinfo -flag PrintGCDetails 進程編號 jinfo -flag MetaspaceSize 進程編號 jinfo -flags 進程編號(所有配置:JVM配置 + 命令行中人工配置)
-XX:+PrintFlagsInitialJVM默認值
-
- 主要查看初始默認
- eg: java -XX:+PrintFlagsInitial
- 符號:= 初始未更新過的值;=:由人為或JVM修改的值
- -XX:+PrintFlagsFinal
- 主要查看修改更新的內容
- eg: java +PrintFlagsFinal -version
- -XX:+PrintCommandLineFlags
- 運行java命令的同時列印出參數
- eg: java -XX:+PrintCommandLineFlags -version
JVM常用的基本參數
- -Xms:
- 初始大小記憶體,默認謂物理記憶體的1/64
- 等價於:-XX:InitialHeapSize
- -Xmx:
- 最大分配記憶體,默認謂物理記憶體的1/4
- 等價於:-XX:MaxHeapSize
- -Xss:
- 設置單個執行緒棧的大小,一般默認為512k ~ 1024k
- 等價於:-XX:ThreadStackSize
- -Xmn:
- 設置年輕化大小
- -XX:MetaspaceSize
- 設置元空間大小:元空間的本質和永久代類似,都是對JVM規範中方法區的實現。不過元空間與永久代之間最大的區別在於,元空間並不在虛擬仙中,而是使用本地記憶體。因此默認情況下,元空間的大小僅受本地記憶體限制
- -Xms 10m -Xmx 10m -XX:MetaspaceSize=1024M -XX:+PrintFlagsFinal
- -XX:+PrintGCDetails
- 輸出GC的詳細收集日誌資訊
- GC
- FULL GC
- -XX:SurvivorRatio
- 設置新生代中eden和s0/s1空間的比例,SurvivorRatio值就是設置eden區的比例佔多少,s0/s1相同, 使用java -XX:+PrintGCDetails查看
- 默認:-XX:SurvivorRatio=8, Eden:s0:s1=8:1:1
- 假如:-XX:SurvivorRatio=4, 則Eden:s0:s1=4:1:1
- -XX:NewRatio
- 配置年輕代與老年代在堆結構的佔比,NewRatio值就是設置老年代的佔比,剩下的1給新生代,使用java -XX:+PrintGCDetails查看
- 默認:-XX:NewRatio=2 新生代佔1, 老年代佔2,年輕代占整個堆的1/3
- 假如:-XX:NewRatio=4 新生化佔1, 老年化佔4,年輕代占整個堆的1/5
- -XX:MaxTenuringThreshold
- 設置垃圾的最大年齡:即新生代經過多少次GC才進入老年代
另外一張圖參考:
2) Java8以後的JVM
3)GC作用域
4)常見的垃圾回收演算法
- 引用計數
- 複製
- 標記清除
- 標記整理
識別某個對象是否是可回收的兩種方法
- 引用計數法
- 枚舉根節點做可達性分析(根搜索路徑)
GC roots 或是tacking GC的“根集合”就是一組必須活躍的引用
基本思路:通過一系列名為“GC Roots”的對象作為起始點,從這個被稱為GC Roots的對象開始向下搜索,如果一個對象到GC Roots沒有任何引用鏈相連時,則說明此對象不可用。也即給定一個集合的引用作為根出發,通過引用關係遍歷對象圖,能被遍歷到的(可到達的)對象就被判定為存活;沒有被遍歷到的就自然被判定為死亡。
GC Roots對象
- 虛擬機棧(棧幀中的局部變數區,也叫做局部變數表)中引用的對象。
- 方法區中的類靜態屬性中引用的對象。
- 方法區中常量引用的對象。
- 本地方法棧中JNI(Native方法)引用的對象。
Full GC