[JVM教程與調優] 什麼是JVM執行時引數?
阿新 • • 發佈:2020-03-31
![什麼是JVM執行時引數?](https://upload-images.jianshu.io/upload_images/7326374-a2488c1593c21f5b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我們接著上一章節[[JVM教程與調優] JVM都有哪些引數型別?](https://mp.weixin.qq.com/s?__biz=MzIwMTg3NzYyOA==&mid=2247484247&idx=2&sn=a1f732611bab89f0db84d3ab162e8763&chksm=96e67244a191fb52a4d6b292112cc94c412d3c90a688bc6da533dec8cfe9cfa693af65b16dd5&token=89408735&lang=zh_CN#rd)的內容繼續講解,這章我們來介紹一下:如何檢視JVM執行時引數。這一點十分重要,因為我們在進行JVM引數調優的時候,我們首先得知道目前系統執行的值是什麼,然後相應的根據相關引數進行調優。
1.-XX:+PrintFlagsInitial(檢視初始值)
2.-XX:+PrinFlagsFinal(檢視最終值)
3.-XX:+UnlockExperimentalVMOptions(解鎖實驗引數)
4.-XX:+UnlockDiagnosticVMOptions(解鎖診斷引數)
5.-XX:+PrintCommandLineFlags(列印命令列引數)
### PrinFlagsFinal
![示例一](https://upload-images.jianshu.io/upload_images/7326374-e20d8dce1da39af5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
bool型別 屬性名:UseG1GC 值:false
因此可以看出,並沒有使用G1GC。
![示例二](https://upload-images.jianshu.io/upload_images/7326374-5b0d84251b57d544.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
InitialHeapSize := 130023424
表示初始堆的值大小。
>注意:
=表示預設值
:=被使用者或者JVM修改後的值
#### 演示一下
![演示](https://upload-images.jianshu.io/upload_images/7326374-9e26042216efce0f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看到有非常多的引數。有興趣的小夥伴可以自己試試。
那麼剛才我們看到的引數是哪個程序的呢?
答案是:通過執行`java -XX:+PrinFlagsFinal -version`這個命令時的程序引數值。
如果我們要檢視一個在執行時的JVM引數值,那麼如何檢視呢?這就是我們後面講到的[jinfo](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD),在此之前,我們先來看一下·jps·。
### jps
`jps`它就類似於Linux系統中的`ps`,也是用來檢視系統程序的。不過它是專門用來檢視java的程序。接下來我們來簡單演示一下`jps`的使用
#### 如何使用?
![jps使用](https://upload-images.jianshu.io/upload_images/7326374-24522a5477151343.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
更多`jps`的適用引數命令,可以去[這裡](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html#CHDCGECD)檢視
![jps的命令使用地址](https://upload-images.jianshu.io/upload_images/7326374-f61e8523903ecaa2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### jinfo
那麼我們如何去檢視一個正在執行的JVM的引數值呢?
那麼用`jinfo`就可以了。
![jinfo使用](https://upload-images.jianshu.io/upload_images/7326374-571aedefe4a84ef6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
再例如,我們如何檢視tomcat的最大記憶體值是多少?那麼我們首先得知道命令,然後找到對應的pid。
![jinfo使用舉例](https://upload-images.jianshu.io/upload_images/7326374-da637184d7dc5368.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如圖,其中23789就是`tomcat`的程序`pid`,檢視對記憶體大小命令:`MaxHeapSize`。
可以看到最大堆記憶體大小為268435456
![jinfo使用舉例2](https://upload-images.jianshu.io/upload_images/7326374-983ab86c1e84bbd0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看到我們手動賦值的引數,也可以看到預設有的引數值。
- 檢視最大記憶體
![檢視最大記憶體](https://upload-images.jianshu.io/upload_images/7326374-9c8cff367256f55f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 檢視垃圾回收器
![檢視垃圾回收器](https://upload-images.jianshu.io/upload_images/7326374-fed639c2465df61d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### jstat檢視JVM統計資訊
- 類裝載
- 垃圾收集
- JIT編譯
垃圾回收這塊非常有用,因為我們能夠非常清楚的看到記憶體結構裡面每一塊的大小是如何進行變化的。
#### 命令格式
![命令格式](https://upload-images.jianshu.io/upload_images/7326374-c2e93761dcf31155.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>options:-class,-compiler,-gc,-printcompilation
我們來檢視一下[jstat](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE)文件。
![jstat文件](https://upload-images.jianshu.io/upload_images/7326374-c289d62d6262f982.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我們來介紹一下幾個命令。
#### 類裝載
![類裝載命令演示](https://upload-images.jianshu.io/upload_images/7326374-5d8642c607ca844d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> jstat -class 3176 1000 10
後面的1000表示每隔1000ms,10表示一共輸出10次
我們來看一下文件中是如何介紹-class命令。
![-class命令](https://upload-images.jianshu.io/upload_images/7326374-da4f15bc607f1b5d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
分別表示什麼含義呢?
- Loaded:類裝載的個數
- Bytes:裝載的kBs數
- Unloaded:解除安裝的個數
- Bytes:解除安裝的kBs數
- Time:所花費的裝載和解除安裝的時間
### 垃圾收集
命令:-gc、-gcutil、-gccause、-gcnew、-gcold
![垃圾收集](https://upload-images.jianshu.io/upload_images/7326374-a34022ecbcb3cccf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
輸入:jstat -gc 3176 1000 3
同樣,後面表示每隔1000ms,一共列印輸出3次
我們同樣來看一下文件中的-gc的命令
![-gc命令](https://upload-images.jianshu.io/upload_images/7326374-669446725afce166.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我們來總結一下-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編譯演示](https://upload-images.jianshu.io/upload_images/7326374-5dec30fdab7b36e2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
這些都表示什麼含義呢?我們來看一下我們的文件。
![JIT命令文件](https://upload-images.jianshu.io/upload_images/7326374-2f4d0030401ae38e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- Compiled:表示完成了多少個編譯任務
- Failed:表示失敗的編譯任務個數
- Invalid:表示無效的編譯任務
- Time:執行編譯任務所花的時間。
- FailedType:上次失敗編譯的編譯型別。
- FailedMethod:上次編譯失敗的類名和方法。
小夥伴可以結合一下上方的演示圖案,來理解一下是什麼含義。
大家瞭解一下就可以,實際工作中作用並不是很大。
以上都是以**JDK1.8**進行介紹。這裡小夥伴們先簡單瞭解一下這一塊,後續再詳細介紹。小夥伴們可以自己在電腦上嘗試一下使用命令,觀察一下列印結果。
關於**JVM引數**的命令,在文件中還有更多的詳細介紹。感興趣的小夥伴,可以自行去檢視。
傳送門:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE
下一章,我們將來學習一下**JVM的記憶體結構以及記憶體溢位**。感興趣的小夥伴,可以關注一下~
## 推薦
- [[JVM教程與調優] 為什麼要學習JVM虛擬機器?](https://mp.weixin.qq.com/s?__biz=MzIwMTg3NzYyOA==&mid=2247484247&idx=1&sn=e41732e54d5b57534d312dc9f15f47f0&chksm=96e67244a191fb5287c35c278cff4810939bd70a76cd4190fe7636d06b3ccb07f6aca974ed62&token=89408735&lang=zh_CN#rd)
- [[JVM教程與調優] JVM都有哪些引數型別?](https://mp.weixin.qq.com/s?__biz=MzIwMTg3NzYyOA==&mid=2247484247&idx=2&sn=a1f732611bab89f0db84d3ab162e8763&chksm=96e67244a191fb52a4d6b292112cc94c412d3c90a688bc6da533dec8cfe9cfa693af65b16dd5&token=89408735&lang=zh_CN#rd)
## 文末
文章收錄至
Github: [https://github.com/CoderMerlin/coder-programming](https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2FCoderMerlin%2Fcoder-programming)
Gitee: [https://gitee.com/573059382/coder-programming](https://links.jianshu.com/go?to=https%3A%2F%2Fgitee.com%2F573059382%2Fcoder-programming)
歡迎**關注**並star~
![微信公眾號](https://upload-images.jianshu.io/upload_images/7326374-0c9d0fbd2c954edb.png?imageMogr2/auto-orient/strip%7CimageView2/2