JAVA系列-JVM

1)JVM體系概述

JVM體系結構概覽

JVM參數調優及相關參數

JVM的參數類型

標配參數:java-version; java -helpX參數:-Xint 解釋執行; -Xcomp 第一次使用就編譯; -Xmixed 混合模式(先編譯再執行)XX參數:Boolean類型:-XX:(+|-)屬性+ 或者-某個屬性值; +表示開啟; -表示關閉eg: -XX:+PrintGCDetailskv設值類型:-XX:key=value說明:鍵值對賦值eg: -XX:MetaspaceSize=128m; -XX:MaxTenuringThreshold=15兩個經典參數:-Xms 和 -Xmx-Xms: 等價於-XX:InitialHeapSize-Xmx:等價於-XX:MaxHeapSize

如果查看一個正在運行的java程序,是否開啟jvm參數是否開啟?具體值是多少?

<code>jps -l
jinfo -flag PrintGCDetails 進程編號
jinfo -flag MetaspaceSize 進程編號
jinfo -flags 進程編號(所有配置:JVM配置 + 命令行中人工配置)/<code>

-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的詳細收集日誌信息GCFULL 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

什麼時候會發生FullGCJava面試總結之Full GC從實際案例聊聊Java應用的GC優化