JVM虛擬機-0五、JVM調優詳解

JVM虛擬機-0五、JVM調優詳解

JVM虛擬機-0五、JVM調優詳解java

1 JVM 參數

1.1 標準參數

-versiongit

-helpgithub

-serverweb

-cpshell

1.2 -X參數

非標準參數,也就是在JDK各個版本中可能會變更tomcat

-Xint   解釋執行
-Xcomp  第一次使用就編譯成本地代碼
-Xmixed  混合模式,JVM本身來決定

1.3 -XX 參數

使用得最多的參數類型session

非標準化參數,相對不穩定,主要用於JVM調優和Debugeclipse

a.Boolean類型
格式:-XX:[+-]<name>      +或-表示啓用或者禁用name屬性
好比:-XX:+UseConcMarkSweepGC  表示啓用CMS類型的垃圾回收器
-XX:+UseG1GC       表示啓用G1類型的垃圾回收器
b.非Boolean類型
格式:-XX<name>=<value>表示name屬性的值是value
好比:-XX:MaxGCPauseMillis=500

1.4 其它參數

-Xms1000等價於-XX:InitialHeapSize=1000
-Xmx1000等價於-XX:MaxHeapSize=1000
-Xss100等價於-XX:ThreadStackSize=100

因此這塊也至關因而-XX類型的參數curl

1.5 查看參數

java -XX:+PrintFlagsFinal -version > flags.txtjvm

值得注意的是"="表示默認值,":="表示被用戶或JVM修改後的值

通常要設置參數,能夠先查看一下當前參數是什麼,而後進行修改

1.6 設置參數的方式

  • 開發工具中設置好比IDEA,eclipse
  • 運行jar包的時候:java -XX:+UseG1GC xxx.jar
  • web容器好比tomcat,能夠在腳本中的進行設置
  • 經過jinfo實時調整某個java進程的參數(參數只有被標記爲manageable的flags能夠被實時修改)

1.7 實踐和單位換算

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是字節單位

2  經常使用命令

2.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 theaccess permissions.

2.2 jinfo

(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

2.3 jstat

(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

2.4 jstack

(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鎖");
         }
       }
     }
   }
 }
}
  • jstack分析

把打印信息拉到最後能夠發現

2.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 打印出堆內存相關信息

-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

3  經常使用工具

3.1 JConsole

JConsole工具是JDK自帶的可視化監控工具。查看java應用程序的運行概況、監控堆信息、永久區使用

狀況、類加載狀況等。

3.2 jvisualvm

  • 能夠監控本地的java進程的CPU,類,線程等
  • 監控遠端Java進程

3.3 Arthas

github :https://github.com/alibaba/arthas

Arthas 是Alibaba開源的Java診斷工具,採用命令行交互模式,是排查jvm相關問題的利器。

3.3.1 下載安裝
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

# 而後能夠選擇一個Java進程

Print usage

java -jar arthas-boot.jar -h
3.3.2 經常使用命令
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:輸出當前方法被調用的調用路徑
相關文章
相關標籤/搜索