[JVM教程與調優] 什麼是JVM運行時參數?

  • 2020 年 3 月 31 日
  • 筆記

什么是JVM运行时参数?

我們接著上一章節[JVM教程與調優] JVM都有哪些參數類型?的內容繼續講解,這章我們來介紹一下:如何查看JVM運行時參數。這一點十分重要,因為我們在進行JVM參數調優的時候,我們首先得知道目前系統運行的值是什麼,然後相應的根據相關參數進行調優。

1.-XX:+PrintFlagsInitial(查看初始值)
2.-XX:+PrinFlagsFinal(查看最終值)
3.-XX:+UnlockExperimentalVMOptions(解鎖實驗參數)
4.-XX:+UnlockDiagnosticVMOptions(解鎖診斷參數)
5.-XX:+PrintCommandLineFlags(列印命令行參數)

PrinFlagsFinal

示例一

bool類型 屬性名:UseG1GC 值:false
因此可以看出,並沒有使用G1GC。

示例二

InitialHeapSize := 130023424
表示初始堆的值大小。

注意:
=表示默認值
:=被用戶或者JVM修改後的值

演示一下

演示

可以看到有非常多的參數。有興趣的小夥伴可以自己試試。

那麼剛才我們看到的參數是哪個進程的呢?
答案是:通過執行java -XX:+PrinFlagsFinal -version這個命令時的進程參數值。

如果我們要查看一個在運行時的JVM參數值,那麼如何查看呢?這就是我們後面講到的jinfo,在此之前,我們先來看一下·jps·。

jps

jps它就類似於Linux系統中的ps,也是用來查看系統進程的。不過它是專門用來查看java的進程。接下來我們來簡單演示一下jps的使用

如何使用?

jps使用

更多jps的適用參數命令,可以去這裡查看
jps的命令使用地址

jinfo

那麼我們如何去查看一個正在運行的JVM的參數值呢?
那麼用jinfo就可以了。

jinfo使用

再例如,我們如何查看tomcat的最大記憶體值是多少?那麼我們首先得知道命令,然後找到對應的pid。

jinfo使用举例

如圖,其中23789就是tomcat的進程pid,查看對記憶體大小命令:MaxHeapSize。
可以看到最大堆記憶體大小為268435456

jinfo使用举例2

可以看到我們手動賦值的參數,也可以看到默認有的參數值。

  • 查看最大記憶體

查看最大内存

  • 查看垃圾回收器

查看垃圾回收器

jstat查看JVM統計資訊

  • 類裝載
  • 垃圾收集
  • JIT編譯

垃圾回收這塊非常有用,因為我們能夠非常清楚的看到記憶體結構裡面每一塊的大小是如何進行變化的。

命令格式

命令格式

options:-class,-compiler,-gc,-printcompilation

我們來查看一下jstat文檔。

jstat文档

我們來介紹一下幾個命令。

類裝載

类装载命令演示

jstat -class 3176 1000 10

後面的1000表示每隔1000ms,10表示一共輸出10次

我們來看一下文檔中是如何介紹-class命令。

-class命令

分別表示什麼含義呢?

  • Loaded:類裝載的個數
  • Bytes:裝載的kBs數
  • Unloaded:卸載的個數
  • Bytes:卸載的kBs數
  • Time:所花費的裝載和卸載的時間

垃圾收集

命令:-gc、-gcutil、-gccause、-gcnew、-gcold
垃圾收集

輸入:jstat -gc 3176 1000 3

同樣,後面表示每隔1000ms,一共列印輸出3次

我們同樣來看一下文檔中的-gc的命令

-gc命令

我們來總結一下-gc輸出結果。

  • S0C、S1C、S0U、S1U:S0和S1的總量與使用量
  • EC、EU:Eden區總量與使用量
  • OC、OU:Old區總量與使用量
  • MC、MU:Metaspace區總量與使用量
  • CCSC、CCSU:壓縮類空間總量與使用量
  • YGC、YGCT:YoungGC的次數與時間
  • FGC、FGCT:FullGC的次數與時間
  • GCT:總的GC時間

JIT編譯

命令:-compiler、-printcompilation

我們來演示一下JIT編譯。

JIT编译演示

這些都表示什麼含義呢?我們來看一下我們的文檔。

JIT命令文档

  • Compiled:表示完成了多少個編譯任務
  • Failed:表示失敗的編譯任務個數
  • Invalid:表示無效的編譯任務
  • Time:執行編譯任務所花的時間。
  • FailedType:上次失敗編譯的編譯類型。
  • FailedMethod:上次編譯失敗的類名和方法。

小夥伴可以結合一下上方的演示圖案,來理解一下是什麼含義。

大家了解一下就可以,實際工作中作用並不是很大。

以上都是以JDK1.8進行介紹。這裡小夥伴們先簡單了解一下這一塊,後續再詳細介紹。小夥伴們可以自己在電腦上嘗試一下使用命令,觀察一下列印結果。
關於JVM參數的命令,在文檔中還有更多的詳細介紹。感興趣的小夥伴,可以自行去查看。
傳送門:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE

下一章,我們將來學習一下JVM的記憶體結構以及記憶體溢出。感興趣的小夥伴,可以關注一下~

推薦

文末

文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關注並star~

微信公众号

Tags: