6個JDK自帶JVM調優工具,你覺得你真的會嗎?

前面已經講過了jps和jstat調優工具。今天咱們繼續說一下其它4個工具。這些工具都在jdk的bin目錄下。java

194f45015a96f546ea2edbcb322b23ed.png

如何使用jinfo工具34c6646acf84e2ffbc053d57a6e8c84d.png

jinfo顯示虛擬機配置信息,咱們經過jinfo --help能看到相應的參數:
算法

061c126d1934f642c4b3144dbe3d91be.png

option說明瀏覽器

no option   輸出所有的參數和系統屬性服務器

-flag  name  輸出對應名稱的參數jvm

-flag [+|-]name  開啓或者關閉對應名稱的參數ide

-flag name=value  設定對應名稱的參數工具

-flags  輸出所有的參數性能

-sysprops  輸出系統屬性spa

咱們能夠先使用jps找到pid操作系統

36fe245f0347fc79cd135e74f2be915f.png

jinfo pid會輸出一堆相關信息

498762b397412055437729fc9adad6e9.png


21ec30972fa119a3f5b224c96f7ff449.png

jinfo -flags pid

用來輸出JVM的所有參數

55a9abd718c4a9472081a1e33e71215e.png

jinfo -flag name pid

使用該命令,能夠查看指定的name爲 JVM參數的值。

如:查看當前 JVM進程是否開啓打印·GC日誌。

b316a065f9755004075e3d19b1636c1f.png

一樣的可使用

jinfo -flag [+|-]name pid

來開啓或者關閉對應名稱的參數 。

也可使用

jinfo -sysprops pid

來輸出當前 JVM進行的所有的系統屬性

如何使用jmap工具34c6646acf84e2ffbc053d57a6e8c84d.png

jmap(Java Memory Map) 命令,主要用於打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。jmap以生成 java程序的 dump 文件, 也能夠查看堆內對象示例的統計信息、查看ClassLoader 的信息以及 finalizer 隊列。

jmap命令能夠得到運行中的JVM的堆的快照,從而能夠離線分析堆,以檢查內存泄漏,檢查一些嚴重影響性能的大對象的建立,檢查系統中什麼對象最多,各類對象所佔內存的大小等等。可使用jmap生成Heap Dump。

Memory = direct memory(直接內存) +JVM memory(MaxPermSize +Xmx)

jmap --help打印輔助信息

9a3bb4f02f74b9dd9a2aaa24d1c83e1b.png

option說明

pid:java進程id,命令ps -ef | grep java獲取,或者jps工具獲取

executable:產生核心dump的java可執行文件

core:須要打印配置信息的核心文件

remote-hostname-or-ip:遠程調試的主機名或ip

server-id:可選的惟一id,若是相同的遠程主機上運行了多臺調試服務器,用此選項參數標識服務器

-dump:[live,]format=b,file=使用hprof二進制形式,輸出jvm的heap內容到文件=. live子選項是可選的,假如指定live選項,那麼只輸出活的對象到文件.

-finalizerinfo 打印正等候回收的對象的信息.

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用狀況.

-histo[:live]打印每一個class的實例數目,內存佔用,類全名信息. JVM的內部類名字開頭會加上前綴」*」. 若是live子參數加上後,只統計活的對象數量.

-clstats(取代了在JDK8以前打印類加載器信息的permstat)打印classloadjvm heap長久層的信息. 包含每一個classloader的名字,活潑性,地址,父classloader和加載的class數量。

使用命名查看JVM的heap信息

jmap -heap pid

輸出Java堆詳細信息 ;

ff7abc194ba5f248b2bae525e700b6f4.png

使用

jmap -histo:live pid

輸出堆中對象的相關統計信息。

第一列是序號,

第二列是對象個數,

第三列是對象大小byte,

第四列是class name

5a1387a65d283ac04d301d344ff478f8.png

使用

jmap -finalizerinfo pid

輸出等待終結的對象信息

8ef2f7bbd700c1d236d38483a2438b7b.png

也可使用

jmap -clstats pid

來輸出類加載器信息 。

ad138605e7bfb4df94f310df90246ec6.png


如何使用jstack工具ca61290997ff15086d34d60f1741a04f.png

jstack命令最大的做用就是用來生成thread dump文件,thread dump文件中記錄了某一時刻CPU信息 。

jstack主要用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,

如線程間死鎖、死循環、請求外部資源致使的長時間等待等。

線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作什麼事情,或者等待什麼資源。若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。

34c6646acf84e2ffbc053d57a6e8c84d.png

option書面

-F:當正常輸出的請求不被響應時,強制輸出線程堆棧。
-l:除堆棧外,會打印出額外的鎖信息,在發生死鎖時能夠用jstack -l pid來觀察鎖持有狀況  
-m:若是調用到本地方法的話,能夠顯示C/C++的堆棧

jstack pid

jstack命令會打印出全部的線程,包括用戶本身啓動的線程和JVM後臺線程,咱們主要關注的是用戶線程;

4fc4c1c7bb6977f40ce34512f141e403.png


1"http-nio-8080-exec-8" #26 daemon prio=5 os_prio=0 tid=0x000000005b940000 nid=0x1e2c waiting on condition [0x000000005c0be000] java.lang.Thread.State: WAITING (parking)

http-nio-8080-exec-8:線程名稱

daemon 表示線程是不是守護線程

prio 表示咱們爲線程設置的優先級

os_prio 表示的對應的操做系統線程的優先級,因爲並非全部的操做系統都支持線程優先級,因此可能會出現都置爲0的狀況

tid 是java中爲這個線程的id

nid 是這個線程對應的操做系統本地線程id,每個java線程都有一個對應的操做系統線程

wait on condition表示當前線程處於等待狀態,可是並沒列出具體緣由

java.lang.Thread.StatC:\Users\Administrator\Desktop\ WAITING (parking) 也是表示的處於等待狀態,括號中的內容說明了致使等待的緣由,例如這裏的parking說明是由於調用了 LockSupport.park方法致使等待

經常使用命令

1# 查詢進程的線程信息 輸出到jstatck_13324文件中
2jstack 13324 > jstatck_13324
3# 十進制轉換爲十六進制
4printf "%x\n" 21742

如何使用jhat工具34c6646acf84e2ffbc053d57a6e8c84d.png

JVM Heap Analysis Tool命令是與jmap搭配使用,用來分析jmap生成的dump,jhat內置了一個微型的HTTP/HTML服務器,生成dump的分析結果後,能夠在瀏覽器中查看。在此要注意,通常不會直接在服務器上進行分析,由於jhat是一個耗時而且耗費硬件資源的過程,通常把服務器生成的dump文件複製到本地或其餘機器上進行分析。

經常使用方式

1#分析 dump 文件
2jhat -J-Xmx512M dump.phrof
3
4#對比 dump 文件
5jhat -baseline dump2.phrof dump1.phrof

代碼案例

1public class JhatTest {
2    public static void main(String[] args) {
3        while(true) {
4            String string = new String("老田");
5            System.out.println(string);
6        }
7    }
8}

運行,使用jps獲取進程pid

0019d28cfcd21f0b5d1e2a054b1ab1c5.png

再使用jmap -dump:format=b,file=heapDump pid

4130993585ee55bbfbb701f63646275c.png

再到對應heapDump的包目錄下執行

jhat heapDump

dfa51802e4e78397d7ba5ac3a6a21e2f.png

而後能夠經過訪問

http://localhost:7000/

e4b52350786df5fbc25d9444a097a76a.png

通常查看堆異常狀況主要看這個兩個部分:

Show instance counts for all classes (excluding platform),平臺外的全部對象信息。以下圖:

5c1b7a1c2ae3e9eed4ae3ec521ba6fce.png

Show heap histogram  以樹狀圖形式展現堆狀況

ea8e18c64256d79da9be60a64deaa6df.png

具體問題排查的時候,須要結合代碼,而後觀察是否大量應該被回收的對象在一直被引用或者是否有佔用內存特別大的對象沒法被回收。 

相關文章
相關標籤/搜索