JVM入門(JVM引數詳解和常用命令)

煉啊啊啊發表於2021-01-05

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=200msG1最大停頓時間暫停時間不能太小,太小的話就會導致出現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診斷工具)

 

 

 

 

 

 

 

相關文章