JVM入門(JVM引數詳解和常用命令)
JVM引數
1.標準引數
包括 -version、-help、-server、-cp 等
可通過 java -help 檢視所有標準引數
2.非標準引數(-X引數)
-Xint 解釋執行
-Xcomp 第一次使用就編譯成原生程式碼
-Xmixed 混合模式,JVM自己來決定
3.-XX引數(使用得最多的引數型別,非標準化引數,相對不穩定,主要用於JVM調優和Debug)
a.Boolean型別
格式:-XX:[+-]<name> +或-表示啟用或者禁用name屬性
比如:-XX:+UseConcMarkSweepGC 表示啟用CMS型別的垃圾回收器
-XX:+UseG1GC 表示啟用G1型別的垃圾回收器
b.非Boolean型別
格式:-XX<name>=<value>表示name屬性的值是value
比如:-XX:MaxGCPauseMillis=500
4.其他引數(等價於-XX型別的引數,可以理解為縮寫)
-Xms1000等價於-XX:InitialHeapSize=1000
-Xmx1000等價於-XX:MaxHeapSize=1000
-Xss100等價於-XX:ThreadStackSize=100
5.檢視引數
java -XX:+PrintFlagsFinal -version
6.設定引數的方式
- 開發工具中設定比如IDEA,eclipse (專案啟動時設定)
- 執行jar包的時候:java -XX:+UseG1GC xxx.jar
- web容器比如tomcat,可以在指令碼中的進行設定
- 通過jinfo實時調整某個java程式的引數(引數只有被標記為manageable的flags才可以被實時修改)
7.常用引數含義
引數 | 含義 | 說明 |
---|---|---|
-XX:CICompilerCount=3 | 最大並行編譯數 | 如果設定大於1,雖然編譯速度會提高,但是同樣影響系統穩定性,會增加VM崩潰的可能 |
-XX;InitialHeapSize=100M | 初始化堆大小 | 簡寫-Xms100M |
-XX:MaxHeapSize=100M | 最大堆大小 | 簡寫-Xmx100M |
-XX:NewSize=20M | 設定年輕代的大小 | |
-XX:MaxNewSize=50M | 年輕代最大大小 | |
-XX:OldSize=50M | 設定老年代大小 | |
-XX:MetaspaceSize=50M | 設定方法區大小 | |
-XX:MaxMetaspaceSize=50M | 方法區最大大小 | |
-XX:+UseParallelGc | 使用UseParallelGC | 新生代,吞吐量優先 |
-XX:+UseParallelOldGc | 使用UseParallelOldGc | 老年代,吞吐量優先 |
-XX:+UseConcMarkSweepGC | 使用CMS | 老年代,停頓時間優先 |
-XX;+UseG1GC | 使用G1Gc | 新生代,老年代,停頓時間優先 |
-XX:NewRatio | 新老生代的比值 | 比如-XX:Ratio=4,則表示新生代:老年代=1:4,也就是新 生代佔整個堆記憶體的1/5 |
-XX:SurvivorRatio | 兩個S區和Eden區的比值 | 比如-XX:SurvivorRatio=8,也就是(SO+S1);Eden=2:8, 也就是一個S佔整個新生代的1/10 |
-XX:+HeapDumpOnOutOfMemoryError | 啟動堆記憶體溢位列印 | 當VM堆記憶體發生溢位時,也就是OOM,自動生成dump 檔案 |
-XX:HeapDumpPath=heap.hprof | 指定堆記憶體溢位列印目錄 | 表示在當前目錄生成一個heap.hprof檔案 |
XX:+PrintGCDetails- XX:+PrintGCTimeStamps - XX:+PrintGCDateStamps Xloggc:$CATALINA_HOME/logslgc.log | 列印出GC日誌 | 可以使用不同的垃圾收集器,對比檢視GC情況 |
-Xss128k | 設定每個執行緒的堆疊大小 | 經驗值是3000-5000最佳 |
-XX:MaxTenuringThreshold=6 | 提升年老代的最大臨界值 | 預設值為15 |
-XX:lnitiatingHeapOccupancyPercent | 啟動併發GC週期時堆記憶體使用佔比 | G1之類的垃圾收集器用它來觸發併發GC週期,基於整個堆 的使用率,而不只是某一代記憶體的使用比.值為О則表 示”一直執行GC迴圈".預設值為45. |
-XX:G1HeapWastePercent | 允許的浪費堆空間的佔比 | 預設是10%,如果併發標記可回收的空間小於10%,則不 會觸發MixedGC. |
-XX:MaxGCPauseMillis=200ms | G1最大停頓時間 | 暫停時間不能太小,太小的話就會導致出現G1跟不上垃 圾產生的速度。最終退化成Full GC。所以對這個引數的 調優是一個持續的過程,逐步調整到最佳狀態。 |
-XX:ConcGCThreads=n | 併發垃圾收集器使用的執行緒數量 | 預設值隨JVM執行的平臺不同而不同 |
-XX:G1MixedGCLiveThresholdPercent=65 | 混合垃圾回收週期中要包括的舊區域設定 佔用率閾值 | 預設佔用率為65% |
-XX:G1MixedGCCountTarget=8 | 設定標記週期完成後,對存活資料上限為 G1MixedGCLlveThresholdPercent的舊 區域執行混合垃圾回收的目標次數 | 預設8次混合垃圾回收,混合回收的目標是要控制在此目 標次數以內 |
-XX:G1OldCSetRegionThresholdPercent=1 | 描述Mixed GC時,Old Region被加入到 CSet中 | 預設情況下,G1只把10%的Old Region加入到CSet中 |
常用命令
1.jps
作用:檢視java程式
The jps command lists the instrumented Java HotSpot VMs on the target system.
The command is limited to reporting information on JVMs for which it has the access permissions.
2.jinfo
(1)實時檢視和調整JVM配置引數
The jinfo command prints Java configuration information for a specified Java
process or core file or a remote debug server. The configuration information
includes Java system properties and Java Virtual Machine (JVM) command-line
flags.
(2)檢視
jinfo -flag name PID : 檢視某個java程式的name屬性的值
例如:
jinfo -flag MaxHeapSize PID
jinfo -flag UseG1GC PID
(3)修改(引數只有被標記為manageable的flags可以被實時修改)
jinfo -flag [+|-] PID
jinfo -flag = PID
(4)檢視曾經賦過值的一些引數
jinfo -flags PID
3.jstat
(1)檢視虛擬機器效能統計資訊
The jstat command displays performance statistics for an instrumented Java
HotSpot VM. The target JVM is identified by its virtual machine identifier, or
vmid option.
(2)檢視類裝載資訊
jstat -class PID 1000 10 檢視某個java程式的類裝載資訊,每1000毫秒輸出一次,共輸出10次
(3)檢視垃圾收集資訊
jstat -gc PID 1000 10 檢視某個java程式的垃圾回收資訊,每1000毫秒輸出一次,共輸出10次
4.jstack
(1)檢視執行緒堆疊資訊
The jstack command prints Java stack traces of Java threads for a specified Java
process, core file, or remote debug server.
(2)用法
jstack PID 檢視應用的執行緒堆疊資訊
(3)排查死鎖案例
//執行主類
public class DeadLockDemo {
public static void main(String[] args) {
DeadLock d1 = new DeadLock(true);
DeadLock d2 = new DeadLock(false);
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();
}
}
//定義鎖物件
class MyLock {
public static Object obj1 = new Object();
public static Object obj2 = new Object();
}
//死鎖程式碼
class DeadLock implements Runnable {
private boolean flag;
DeadLock(boolean flag) {
this.flag = flag;
}
public void run() {
if (flag) {
while (true) {
synchronized (MyLock.obj1) {
System.out.println(Thread.currentThread().getName() + "----if
獲得obj1鎖");
synchronized (MyLock.obj2) {
System.out.println(Thread.currentThread().getName() + "---
- if獲得obj2鎖");
}
}
}
} else {
while (true) {
synchronized (MyLock.obj2) {
System.out.println(Thread.currentThread().getName() + "----否則
獲得obj2鎖");
synchronized (MyLock.obj1) {
System.out.println(Thread.currentThread().getName() + "---
- 否則獲得obj1鎖");
}
}
}
}
}
}
執行結果
通過jstack分析(發現死鎖):
5.jmap
(1)生成堆轉儲快照
The jmap command prints shared object memory maps or heap memory details of a
specified process, core file, or remote debug server.
(2)列印出堆記憶體相關資訊
jmap -heap PID
(3)dump出堆記憶體相關資訊
jmap -dump:format=b,file=heap.hprof PID 將當前執行緒的堆記憶體資訊以二進位制的方式輸出到heap.hprof檔案中
例:jmap -dump:format=b,file=heap.hprof 44808
(4)發生堆記憶體溢位的時候,需要自動dump檔案
一般需要配置一下引數:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
常用工具
1.jconsole
2. jvisualvm
3.Arthas(Alibaba開源的Java診斷工具)
相關文章
- JVM(一)-JVM入門JVM
- JVM入門JVM
- JVM系列(四) – JVM類載入機制詳解JVM
- JVM系列(四) - JVM類載入機制詳解JVM
- 常用JVM引數JVM
- jvm引數配置JVM
- JVM記憶體引數詳解及其配置調優JVM記憶體
- 【7】JVM引數說明和分析JVM
- JVM引數以及用法JVM
- 檢視JVM預設引數及微調JVM啟動引數JVM
- 【死磕JVM】JVM快速入門之前戲篇JVM
- JVM效能優化(一)JVM技術入門JVM優化
- JVM 引數調優(qbit)JVM
- JVM常用調優引數JVM
- JVM實用引數系列JVM
- JVM引數分享 OmitStackTraceInFastThrowJVMMITAST
- tomcat jvm 引數配置TomcatJVM
- sap入門--sap配置引數詳解
- JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略JVM面試GC
- JVM入門--類載入器JVM
- JVM垃圾回收詳解JVM
- JVM 除錯工具入門JVM除錯
- JVM-垃圾收集入門JVM
- JVM常見引數設定JVM
- JVM引數設定大氣JVM
- JVM記憶體引數配置JVM記憶體
- 實用 JVM 引數總結JVM
- 全面輸出JVM配置引數JVM
- JVM 從入門到實戰--- 01 JVM 基本介紹JVM
- 常用的jvm配置引數 :永久區引數配置JVM
- JVM GC 日誌詳解JVMGC
- JVM實用引數(一)JVM型別以及編譯器模式JVM型別編譯模式
- JVM(一)史上最佳入門指南JVM
- JVM垃圾回收機制入門JVM
- jvm(四)——JVM自帶記憶體分析工具詳解JVM記憶體
- 【隨筆】JVM核心:JVM執行和類載入JVM
- 檢視JVM執行時引數JVM
- 檢視JVM預設配置引數JVM