JAVA系列-JVM

1)JVM體系概述

JVM體系結構概覽

JAVA系列-JVM

JVM參數調優及相關參數

JVM的參數類型

  • 標配參數:java-version; java -help
  • X參數:-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
JAVA系列-JVM

  • -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才進入老年代

另外一張圖參考:

JAVA系列-JVM

2) Java8以後的JVM

3)GC作用域

4)常見的垃圾回收算法

  • 引用計數
  • 複製
  • 標記清除
  • 標記整理

識別某個對象是否是可回收的兩種方法

  • 引用計數法
  • 枚舉根節點做可達性分析(根搜索路徑)

GC roots 或是tacking GC的“根集合”就是一組必須活躍的引用

JAVA系列-JVM

基本思路:通過一系列名為“GC Roots”的對象作為起始點,從這個被稱為GC Roots的對象開始向下搜索,如果一個對象到GC Roots沒有任何引用鏈相連時,則說明此對象不可用。也即給定一個集合的引用作為根出發,通過引用關係遍歷對象圖,能被遍歷到的(可到達的)對象就被判定為存活;沒有被遍歷到的就自然被判定為死亡。

JAVA系列-JVM

GC Roots對象

  • 虛擬機棧(棧幀中的局部變量區,也叫做局部變量表)中引用的對象。
  • 方法區中的類靜態屬性中引用的對象。
  • 方法區中常量引用的對象。
  • 本地方法棧中JNI(Native方法)引用的對象。

Full GC

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


分享到:


相關文章: