JVM虛擬機-0五、JVM調優詳解java
-versiongit
-helpgithub
-serverweb
-cpshell
非標準參數,也就是在JDK各個版本中可能會變更tomcat
-Xint 解釋執行 -Xcomp 第一次使用就編譯成本地代碼 -Xmixed 混合模式,JVM本身來決定
使用得最多的參數類型session
非標準化參數,相對不穩定,主要用於JVM調優和Debugeclipse
a.Boolean類型 格式:-XX:[+-]<name> +或-表示啓用或者禁用name屬性 好比:-XX:+UseConcMarkSweepGC 表示啓用CMS類型的垃圾回收器 -XX:+UseG1GC 表示啓用G1類型的垃圾回收器 b.非Boolean類型 格式:-XX<name>=<value>表示name屬性的值是value 好比:-XX:MaxGCPauseMillis=500
-Xms1000等價於-XX:InitialHeapSize=1000 -Xmx1000等價於-XX:MaxHeapSize=1000 -Xss100等價於-XX:ThreadStackSize=100
因此這塊也至關因而-XX類型的參數curl
java -XX:+PrintFlagsFinal -version > flags.txt
jvm
值得注意的是"="表示默認值,":="表示被用戶或JVM修改後的值
通常要設置參數,能夠先查看一下當前參數是什麼,而後進行修改
1Byte(字節)=8bit(位) 1KB=1024Byte(字節) 1MB=1024KB 1GB=1024MB 1TB=1024GB
(1)設置堆內存大小和參數打印 -Xmx100M -Xms100M -XX:+PrintFlagsFinal (2)查詢+PrintFlagsFinal的值 :=true (3)查詢堆內存大小MaxHeapSize := 104857600 (4)換算 104857600(Byte)/1024=102400(KB) 102400(KB)/1024=100(MB) (5)結論 104857600是字節單位
查看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 theaccess permissions.
(1) 實時查看和調整JVM配置參數
The jinfo command prints Java configuration information for a specified Javaprocess or core file or a remote debug server. The configuration informationincludes Java system properties and Java Virtual Machine (JVM) command-lineflags.
(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
(1) 查看虛擬機性能統計信息
The jstat command displays performance statistics for an instrumented JavaHotSpot VM. The target JVM is identified by its virtual machine identifier, orvmid option.
(2) 查看類裝載信息
jstat -class PID 1000 10 查看某個java進程的類裝載信息,每1000毫秒輸出一次,共輸出10次
(3) 查看垃圾收集信息
jstat -gc PID 1000 10
(1) 查看現場堆棧信息
The jstack command prints Java stack traces of Java threads for a specified Javaprocess, core file, or remote debug server.
(2)用法
jstack PID
(3) 排查死鎖案列
DeadLockDemo
//運行主類 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鎖"); } } 咕泡學院 只爲更好的你 運行結果 jstack分析 把打印信息拉到最後能夠發現 } } else { while(true){ synchronized(MyLock.obj2) { System.out.println(Thread.currentThread().getName()+"----不然 得到obj2鎖"); synchronized(MyLock.obj1) { System.out.println(Thread.currentThread().getName()+"--- -不然得到obj1鎖"); } } } } } }
把打印信息拉到最後能夠發現
- 生成堆快照
The jmap command prints shared object memory maps or heap memory details of a specified process, core file, or remote debug server.
2 打印出堆內存相關信息
-XX:+PrintFlagsFinal -Xms300M -Xmx300M jmap -heap PID
3 dump出堆內存相關信息
jmap -dump:format=b,file=heap.hprof PID
jmap -dump:format=b,file=heap.hprof 44808
4 發送堆內存溢出問題 自動dump文件
通常在開發中,JVM參數能夠加上下面兩句,這樣內存溢出時,會自動dump出該文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
JConsole工具是JDK自帶的可視化監控工具。查看java應用程序的運行概況、監控堆信息、永久區使用
狀況、類加載狀況等。
github :https://github.com/alibaba/arthas
Arthas 是Alibaba開源的Java診斷工具,採用命令行交互模式,是排查jvm相關問題的利器。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar # 而後能夠選擇一個Java進程
Print usage
java -jar arthas-boot.jar -h
version:查看arthas版本號 help:查看命名幫助信息 cls:清空屏幕 session:查看當前會話信息 quit:退出arthas客戶端 --- dashboard:當前進程的實時數據面板 thread:當前JVM的線程堆棧信息 jvm:查看當前JVM的信息 sysprop:查看JVM的系統屬性 --- sc:查看JVM已經加載的類信息 dump:dump已經加載類的byte code到特定目錄 jad:反編譯指定已加載類的源碼 --- monitor:方法執行監控 watch:方法執行數據觀測 trace:方法內部調用路徑,並輸出方法路徑上的每一個節點上耗時 stack:輸出當前方法被調用的調用路徑