【JVM】GCRoots和JVM的參數配置

如何理解GCRoots?

爲了解決引用計數法的循環引用問題,Java使用了可達性分析的方法。GC Roots是一組活躍的引用,通過一系列名爲GC Roots的對象作爲起始點,沿着該對象向下搜索,如果一個對象GC Roots沒有任何引用鏈相連,則說明對象不可用。

 哪些可以作爲GC Roots的對象?

  1. 虛擬機棧(棧幀中的本地變量表)中引用的對象
  2. 方法區的類靜態屬性引用的對象
  3. 方法區中常量引用的對象
  4. 本地方法棧中JNI(Java本地接口)(native方法)中引用的對象

JVM的參數類型

參數的三大類型

標配參數:java -version、java -help

X參數(瞭解):

  • -Xint:解釋執行。在解釋模式(interpreted mode)下,-Xint標記會強制JVM執行所有的字節碼,當然這會降低運行速度,通常低10倍或更多。
  • -Xcomp:第一次使用就編譯成本地代碼,與(-Xint)正好相反,JVM在第一次使用時會把所有的字節碼編譯成本地代碼,從而帶來最大程度的優化。很多應用在使用-Xcomp也會有一些性能損失,當然這比使用-Xint損失的少,原因是-xcomp沒有讓JVM啓用JIT編譯器的全部功能。JIT編譯器可以對是否需要編譯做判斷,如果所有代碼都進行編譯的話,對於一些只執行一次的代碼就沒有意義。
  • -Xmixed:混合模式,將解釋模式與編譯模式進行混合使用,由jvm自己決定,這是jvm默認的模式,也是推薦使用的模式。

XX參數:

  • Boolean類型:【-XX:+/- 某個參數值】+表示開啓,-表示關閉
  • Key-Value類型:【-XX:key=value】例如:-XX:MetaspaceSize=128m、-XX:MaxTenuringThreshold=15
  • jinfo類型:查看當前運行程序的配置

如何查詢參數配置?

查看運行中的Java程序某個JVM參數值是否開啓及具體值:

  • jps:查看後來進程
  • jinfo:查看當前運行程序的配置。【jinfo -flag + 需要查詢的參數信息 + 進程號】/【jinfo -flags】

 

如上圖所示,【jps -l】 獲得正在運行的java進程的進程號,【jinfo -flag + 需要查詢的參數信息 + 進程號】,得到-XX參數的配置結果,參數名稱前面是 - 號,表示沒有開啓。

對於Key-Value類型的XX參數,如果沒有顯式的配置,則查詢到的結果則是JVM的默認配置值。

 

 Command line是手動配置項,Non -default VM flags是JVM默認沒有修改過的項。

-Xms和-Xmx是屬於那一類呢?

-Xms和-Xmx實際上是-XX類的參數,-Xms和-Xmx其實是別名。

-Xms等價於 -XX: InitialHeapSize【初始值是物理內存的1/64】

-Xmx等價於 -XX: MaxHeapSize【初始值是物理內存的1/4】

查詢參數的其他命令

java -XX:+PrintFlagsInitial :查看JVM的參數的初始配置。

java -XX:+PrintFlagsFinal -version:查看修改過的參數配置。【=沒有修改過,:=修改過】

java -XX:+PrintFlagsFinal -XX:MetaspaceSize=256m 運行的類名 :運行java命令的同時打印參數

java -XX:+PrintCommandLineFlags -version:打印HotSpotVM 採用的自動優化參數

JVM常用基本配置參數

  • -Xms:初始大小內存,物理內存的1/64,等價於-XX:IntialHeapSize
  • -Xmx:最大分配內存,物理內存的1/4,等價於-XX:MaxHeapSize
  • -Xss:設置單個線程棧的大小,一般默認爲512KB~1024KB,等價於-XX:ThreadStackSize
  • -Xmn:設置年輕代的大小,默認堆內存的1/3
  • -XX:MetaspaceSize:設置元空間大小。元空間的本質和永久代類似,都是對JVM規範中的方法區的實現,二者區別在於元空間不再虛擬機中,而是在本地內存中。所以默認情況下,元空間的大小僅受本地內存限制。一般只取出20多MB,可以自已調大一些。
  • -XX:+PrintGCDetails:打印GC日誌
  • -XX:SurvivorRatio:設置年輕代eden/s0/s1的空間比例。默認值是8,也就是8:1:1,如果是4,就是4:1:1。
  • -XX:NewRatio:設置年輕代和老年代在堆中的佔比。默認值是2,也就是新生代1老年代2,如果是4,就是新生代1老年代4,老年代佔堆的4/5
  • -XX:MaxTenuringThreshold:設置進入老年代的最大年齡(在年輕代複製交換的次數),默認15次。只能設置爲0~15之間。

每個Java線程都有兩個堆棧:一個用於Java代碼,一個用於本機代碼。主線程的最大本機堆棧大小由本機應用程序啓動器(例如,shell或操作系統)確定。對於後續線程,最大本機堆棧大小由該-Xss選項設置,儘管這可由基礎操作系統忽略。-Xss的默認值爲0表示該值實際上是由本機環境設置的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章