中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JVM的性能監控工具是什么

發布時間:2021-10-21 10:33:59 來源:億速云 閱讀:198 作者:柒染 欄目:大數據

JVM的性能監控工具是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

我們知道,在JVM編譯期和加載器,甚至運行期已經做了大量的調優操作,但是那些都是JVM針對Java程序所做的通用的、簡單的優化,程序在運行時由于運行環境的復雜性、業務邏輯的復雜性,很多JVM是無法進行優化處理的,這就需要我們自己在寫代碼的時候就注意,以便我們的程序在特定的業務場景發揮到最佳性能。

要進行性能調優,首先我們要找到程序的性能瓶頸在哪里?而要知道性能瓶頸在哪里,我們需要借助一定的工具進行處理。

在windows操作系統下,當我們的系統運行很慢的時候,80%的人首先查看的就是任務管理器,因為它可以讓我們快讀的知道是那個程序占用了較多的資源(如CPU、內存、磁盤IO等),或者是那個進程不能響應導致整個操作系統巨卡,我們通過任務管理器可以輕松的查看和管理我們的應用程序,如下圖所示:

JVM的性能監控工具是什么 

JVM的性能監控工具是什么

 打開對應的資源監視器,如下圖所示:

JVM的性能監控工具是什么

 以上是

windows自帶的一些監控工具,當然我們知道面向windows的監控工具比比皆是,我在這里就不多說了。

而我們的服務器大部分是運行在Linux下,如我們現在的服務器使用的是CentOS5.5的操作系統(Linux2.6內核),那在Linux下都有哪些工具可以使用的呢?

在Linux下使用的最頻繁的一個命令是top,如下圖所示

JVM的性能監控工具是什么

 當然,針對我們

Java開發人員,這一點是遠遠不夠的,我們還需要更詳細的信息。Linux工具集SysStat(下載地址:http://sebastien.godard.pagesperso-orange.fr/download.html)為我們提供了一系列指令集,我們在尋找下面會提到,但其實JDK已經為我們提供了很多很好的針對Java的性能監控工具,下面我們就來一起看一下JDK都為我們提供了哪些性能檢測工具。

一、Jps(JVM Process Status Tools)

Jps是參照Unix系統的取名規則命名的,而他的功能和ps的功能類似,可以列舉正在運行的餓虛擬機進程并顯示虛擬機執行的主類以及這些進程的唯一ID(LVMID,對應本機來說和PID相同),他的用法如下:

Jps [option] [hostid]

其中hostid默認為本機,而option選項包含以下選項

Option

Function

-q

只輸出LVMID

-m

輸出JVM啟動時傳給主類的方法

-l

輸出主類的全名,如果是Jar則輸出jar的路徑

-v

輸出JVM的啟動參數

JVM的性能監控工具是什么

 二、

jstat(JVM Statistics Monitoring Tools)

Jstat主要用于監控虛擬機的各種運行狀態信息,如類的裝載、內存、垃圾回收、JIT編譯器等,在沒有GUI的服務器上,這款工具是首選的一款監控工具。其用法如下:

jstat [option vmid [interval [s|ms] [vount] ] ]

參數interval和count分別表示查詢間隔和查詢次數,如每1毫秒查詢一次進程20445的垃圾回收情況,監控20次,命令如下所示:

jstat –gc 20445 1 20

JVM的性能監控工具是什么

 …

還有很多參數信息,我們可以看到除了我們顯式指定的參數信息以外,JVM的默認參數一覽無余。同時,從JDK1.6以后,jinfo加入了運行時修改參數信息的能力,可以使用-flag [+|-]name 或者-flag name=value來修改一部分運行期可以寫入的虛擬機參數。更多信息可參考官方文檔。

四、jmap(JVM Memory Map for Java)

Jmap用于生成堆快照(heapdump)。當然我們有很多方法可以取到對應的dump信息,如我們通過JVM啟動時加入啟動參數 –XX:HeapDumpOnOutOfMemoryError參數,可以讓JVM在出現內存溢出錯誤的時候自動生成dump文件,亦可以通過-XX:HeapDumpOnCtrlBreak參數,在運行時使用ctrl+break按鍵生成dump文件,當然我們也可以使用kill -3 pid的方式去恐嚇JVM生成dump文件。Jmap的作用不僅僅是為了獲取dump文件,還可以用于查詢finalize執行隊列、Java堆和永久帶的詳細信息,如空間使用率、垃圾回收器等。其運行格式如下:

Jmap [option] vmip

Option的信息如下表所示

Option

Function

-dump

生成對應的dump信息,用法為-dump:[live,]format=b,file={fileName}

-finalizerinfo

顯示在F-Queue中等待的Finalizer方法的對象(只在linux下生效)

-heap

顯示堆的詳細信息、垃圾回收器信息、參數配置、分代詳情等

-histo

顯示堆棧中的對象的統計信息,包含類、實例數量和合計容量

-permstat

以ClassLoder為統計口徑顯示永久帶的內存狀態

-F

當虛擬機對-dump無響應時可使用這個選項強制生成dump快照

示例:jmap -dump:format=b,file=yhj.dump 20445

 JVM的性能監控工具是什么

 五、

jhat(JVM Heap Analysis Tool)

Jhat是用來分析dump文件的一個微型的HTTP/HTML服務器,它能將生成的dump文件生成在線的HTML文件,讓我們可以通過瀏覽器進行查閱,然而實際中我們很少使用這個工具,因為一般服務器上設置的堆、棧內存都比較大,生成的dump也比較大,直接用jhat容易造成內存溢出,而是我們大部分會將對應的文件拷貝下來,通過其他可視化的工具進行分析。啟用法如下:

Jhat {dump_file}

執行命令后,我們看到系統開始讀取這段dump信息,當系統提示Server is ready的時候,用戶可以通過在瀏覽器鍵入http://ip地址:7000進行查詢。

我們可以看到剛才生成的dump文件有多大

 JVM的性能監控工具是什么

 //……..

 JVM的性能監控工具是什么

 我們可以看到,很詳細的類信息都被抓了出來

 JVM的性能監控工具是什么

 從JDK1.5以后,java.lang.Thread類增加了一個getAllStackTraces()方法用于獲取虛擬機中的StackTraceElement對象,使用這段代碼我們可以通過很簡單的代碼獲取對應JVM的信息,下面是一個簡單的示例:

package com.yhj.monitor;

import java.util.Map;
import java.util.Set;
/**
 * @Described:線程監控器
 * @author YHJ create at 2012-3-26 下午05:20:18
 * @FileNmae com.yhj.monitor.Threadmonitor.java
 */
public class Threadmonitor {

    public static void main(String[] args) {
       Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
       Set<Thread> set = map.keySet();
       for(Thread thread : set){
           System.out.println("檢測到線程["+thread.getId()+":"+thread.getName()+"],線程詳細信息:");
           for(StackTraceElement trace:map.get(thread)){
              System.out.println(trace);
           }
       }
    }
}

一次運行結果如下:

JVM的性能監控工具是什么

 這款工具既可以實現本地監控,亦可以實現遠程監控

.

啟動后界面如圖所示:

 JVM的性能監控工具是什么

 在線程tab,我們可以追蹤對應線程的變化情況

 JVM的性能監控工具是什么

package com.yhj.monitor;
/**
 * @Described:死鎖演示
 * @author YHJ create at 2012-3-26 下午05:46:36
 * @FileNmae com.yhj.monitor.Deadlock.java
 */
public class Deadlock implements Runnable{
    private int a;
    private int b;
    public Deadlock(int a, int b) {
       super();
       this.a = a;
       this.b = b;
    }
    @Override
    public void run() {
       synchronized (Integer.valueOf(a)) {
           synchronized (Integer.valueOf(b)) {
              System.out.println("a+b="+(a+b));
           }
       }
    }
    public static void main(String[] args) {
       for(int i = 0; i < 1000; ++i){
           new Thread(new Deadlock(1, 2)).start();
           new Thread(new Deadlock(2, 1)).start();
       }
    }
}

這段代碼執行一段時間你會發現他不動了,如下圖所示:

JVM的性能監控工具是什么

 我們使用Jconsole的線程tab,下面有一個檢測死鎖的按鈕,點擊一下

JVM的性能監控工具是什么

Jconsole很清楚的告訴我們發生了死鎖,如上圖所示。并且明確的告訴我們死鎖線程每個線程都在干什么?什么資源導致了死鎖的發生,很精確。

很多人還在迷惑,上段代碼怎么可能發生死鎖的?每個線程獨享一個a和一個b,互不相干,怎么可能發生死鎖呢?

其實發生死鎖的原因是我們調用了Integer.valueOf()方法,這個方法是基于減少創建對象次數和節省內存設計的,出于這個的考慮,在[-128~127]之間的數字會被緩存掉,也就是我們循環中傳輸了那么多的1和2其實就返回的2個,當某個對象持有1,而另外一個對象持有2的時候,第一個等待2的釋放,而第二個等待1的釋放,因此就發生了死鎖。其實這個程序的循環也是不需要的,2個線程就可能引發死鎖,但是程序執行太快,概率太小,加一個1000次的循環就是為了增大這種概率。

二、VisualVM

VisualVM被成為是more in one的工具集,它可以實現以下功能點:

1、  顯示虛擬機的進程以及進程的配置信息和環境信息(jps、jinfo)

2、  監視應用程序的CPU、內存、堆、方法區和線程信息(jstat、jstack)

3、  Dump以及分析dump的功能(jmap、jhat)

4、  離線程序快照:離線dump分析

5、  方法運行性能分析,找出調用最多,運行最長的方法塊

6、  Plugings動態擴展功能

VisualVM因為是基于netBean開發,因此天生就具有plug大量擴展的能力,我們可以通過他的插件頁面輕松安裝所需要的插件!

啟用VisualVM工具會很醒目的告訴我們檢測到一個死鎖,而不需要我們在Jconsole下手動啟用檢測。如下圖所示:

 JVM的性能監控工具是什么

JVM的性能監控工具是什么

JVM的性能監控工具是什么

 JVM的性能監控工具是什么

JVM的性能監控工具是什么

 在VisualVM中有一個開源的,強大的插件,叫做BTrace。這是一個很有意思的插件,假設這么一種場景,某天你的程序突然出現了某個差錯,但是有沒有寫日志,怎么辦呢?BTrace就可以通過簡單的代碼注入,在你不重啟服務器的情況下動態加入相關的日志語句。相關示例請參見官方DEMO:https://hg.kenai.com/hg/btrace~hg/file/d31d25ebd48b/samples。

JVM的性能監控工具是什么

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jvm
AI

墨玉县| 丰宁| 德化县| 小金县| 平利县| 库尔勒市| 遵义市| 彭州市| 公安县| 神池县| 临夏县| 汤原县| 黄石市| 榕江县| 和顺县| 长春市| 河南省| 正安县| 汨罗市| 黎平县| 崇州市| 茌平县| 汝州市| 浦城县| 通榆县| 昌都县| 维西| 崇左市| 罗山县| 鞍山市| 花莲县| 汶川县| 鸡西市| 剑河县| 周口市| 清苑县| 凤凰县| 禄劝| 于都县| 墨玉县| 会同县|