JAVA系列-JVM

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

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

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之後的JVMjava

3)GC做用域

4)常見的垃圾回收算法

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

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

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

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

 

基本思路:經過一系列名爲「GC Roots」的對象做爲起始點,從這個被稱爲GC Roots的對象開始向下搜索,若是一個對象到GC Roots沒有任何引用鏈相連時,則說明此對象不可用。也即給定一個集合的引用做爲根出發,經過引用關係遍歷對象圖,能被遍歷到的(可到達的)對象就被斷定爲存活;沒有被遍歷到的就天然被斷定爲死亡。面試

 

GC Roots對象

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

Full GC

相關文章
相關標籤/搜索