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

溫馨提示×

溫馨提示×

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

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

怎么使用JVM調優技術

發布時間:2021-10-18 15:59:41 來源:億速云 閱讀:137 作者:iii 欄目:編程語言

本篇內容介紹了“怎么使用JVM調優技術”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

(一)調優工具

1.1 jmap

查看實例個數以及占用內存信息,最后一位表示進程id,可以用jps命令查看

jmap -histo pid

怎么使用JVM調優技術

num:代表序號 instances:代表實例數量 bytes:代表占用空間大小 classname:代表類的名稱

查看堆的使用情況

jmap -heap pid

通過該命令可以看到垃圾回收器,堆的參數以及堆的使用情況等信息。

怎么使用JVM調優技術

堆內存dump

jmap -dump:format=b,file=D:/demo.hprof pid

通過命令將JVM運行文件拷貝出來,生成dump文件后,可以用JDK自帶的可視化分析工具分析它,命令行下輸入

jvisualvm

自動打開一個可視化窗口,將我們生成的文件裝入:

怎么使用JVM調優技術

所有信息都可以在可視化頁面中看到

怎么使用JVM調優技術

通過Jvm參數可設置內存溢出后自動導出Dump文件:

-XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dump

1.2 Jstack

通過Jstack命令加進程的id即可查找死鎖,首先寫一段代碼制造一個死鎖

public class DeadLockTest {
    public static Object lock1=new Object();
    public static Object lock2=new Object();

    public static void main(String[] args) {
        new Thread(()->{
            synchronized (lock1){
                try {
                    System.out.println(Thread.currentThread().getName()+"begin");
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println(Thread.currentThread().getName()+"end");
                }
            }
        }).start();

        new Thread(()->{
            synchronized (lock2){
                try {
                    System.out.println(Thread.currentThread().getName()+"begin");
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println(Thread.currentThread().getName()+"end");
                }
            }
        }).start();
    }
}

這段代碼會制造第一個線程鎖住lock1等待鎖lock2,第二個線程鎖住lock2等待鎖lock1的死鎖。

首先通過jps命令查到進程號,我這里是15820,接著使用jstack命令:

jstack 15820

通過該命令可以很輕松地找到死鎖。

怎么使用JVM調優技術

1.3 Jinfo

查看正在運行的Java項目參數 查看jvm的參數

jinfo -flags pid

可以查看到jvm的所有參數

怎么使用JVM調優技術

查看Java系統參數

jinfo -sysprops pid

可以查看到JDK版本、位置等信息。

1.4 jvisualvm

可視化的JVM監控工具,上面所講到的這些命令,都可以直接在jvisualvm中看到可視化數據,但是這個工具在生產環境中需要謹慎使用,因為會占用一定資源。

(三)Jstat

jstat其實也是JVM自帶的一個調優工具,但是我這里把他單獨拿出來是因為正式對JVM調優中,這條命令是最常用的。

jstat命令可以查看堆內存各部分的使用量,以及加載類的數量等。

2.1 垃圾回收統計

評估內存使用及GC壓力情況

jstat -gc pid

我執行這段代碼后,出現了一串數據

怎么使用JVM調優技術

所有參數的解釋都放在下面了,結合垃圾回收一起看,就能懂了。

S0C:第一個Survivor大小(kb)
S1C:第二個Survivor大小
S0U:第一個Survivor區的使用大小
S1U:第二個Survivor區的使用大小
EC:eden區大小
EU:eden區的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法區大小(元空間)
MU:方法區使用大小
CCSC:壓縮類空間大小
CCSU:壓縮類空間使用大小
YGC:YoungGC次數
YGCT:YoungGC時間(s)
FGC:FullGC次數
FGCT:FullGC時間(s)
GCT:總的GC時間(s)

2.2 垃圾回收比例統計

給出各個區的使用比例:

jstat -gcutil pid

參數介紹:

S0:第一個Survivor區當前使用比例
S1:第二個Survivor區當前使用比例
E:eden區使用比例
O:老年代使用比例
M:元數據區使用比例
CCS:壓縮使用比例
YGC:YoungGC次數
FGC:FullGC次數
FGCT:FullGC消耗時間
GCT:垃圾回收消耗總時間

2.3 堆內存統計

統計堆內存的使用情況

jstat -gccapacity pid

介紹一下參數:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:當前新生代容量
S0C:第一個Survivor區大小
S1C:第二個Survivor區的大小
EC:eden區的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:當前老年代大小
OC:當前老年代大小
MCMN:最小元數據容量
MCMX:最大元數據容量
MC:當前元數據空間大小
CCSMN:最小壓縮類空間大小
CCSMX:最大壓縮類空間大小
CCSC:當前壓縮類空間大小
YGC:YoungGC次數
FGC:FullGC次數

2.4 新生代垃圾回收統計

統計新生代垃圾回收的數據

jstat -gcnew pid

介紹參數:

S0C:第一個Survivor區的大小
S1C:第二個Survivor區的大小
S0U:第一個Survivor區的使用大小
S1U:第二個Survivor區的使用大小
TT:對象在新生代存活的次數
MTT:對象在新生代存活的最大次數
DSS:期望的幸存區大小
EC:eden區的大小
EU:eden區的使用大小
YGC:年輕代垃圾回收次數
YGCT:年輕代垃圾回收消耗時間

2.5 新生代內存統計

統計新生代內存的使用情況

jstat -gcnewcapacity pid

介紹參數:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:當前新生代容量
S0CMX:第一個Survivor區最大容量
S0C:第一個Survivor區大小
S1CMX:第二個Survivor區最大容量
S1C:第二個Survivor區大小
ECMX:eden區最大容量
EC:當前eden區大小
YGC:年輕代垃圾回收次數
FGC:老年代回收次數

2.6 老年代垃圾回收統計

統計老年代垃圾回收的數據

jstat -gcold pid

參數介紹:

MC:方法區大小
MU:方法區使用大小
CCSC:壓縮類空間大小
CCSU:壓縮類空間使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年輕代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間

2.7 老年代內存統計

統計老年代內存的使用情況

jstat -gcoldcapacity pid

參數介紹:

OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:當前老年代大小
OC:老年代大小
YGC:年輕代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間

2.8 元空間統計

統計元數據空間的情況

jstat -gcmetacapacity pid

參數介紹

MCMN:最小元數據容量
MCMX:最大元數據容量
MC:當前元數據空間大小
CCSMN:最小壓縮類空間大小
CCSMX:最大壓縮類空間大小
CCSC:當前壓縮類空間大小
YGC:年輕代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間

(三)JVM運行情況分析思路

上面的這些知識調優的工具,我們除了要了解這些工具的含義之外,還需要知道這些如何使用這些工具去分析JVM的運行情況。

3.1 分析年輕代對象增長速率

我們都知道新對象的產生會在eden區,因此我們可以通過下面的命令:

jstat -gc pid 5000 10

每5秒執行一次,執行10次,然后觀察這50秒內eden區增加的趨勢,即可知道年輕代對象增長的速率。

3.2 分析YGC情況

jstat -gc命令中展示了YGCT和YGC,通過YGCT/YGC可以算出YGC的平均耗時。通過每隔一段時間輸出一次我們也能觀察出YGC的頻率。

3.3 YGC后對象存活情況

每次YGC過后,eden區數量會大幅減少,而survivor和老年代的數量會增加,這樣我們就能計算出每次每次YGC后存活的對象數量,以及推斷老年代對象增長的速率。

3.4 分析FGC情況

分析FGC的思路和分析YGC一樣,通過增長速率推斷FGC頻率,通過計算FGCT/FGC計算平均每次FGC耗時。

優化思路在于:盡量減少FGC的次數,避免頻繁FGC對JVM性能的影響,因此盡量別讓對象進入老年代,也就是每次YGC后存活的對象盡量少于Survivor的50%。

(四)GC日志

有時候系統突然運行緩慢無法找到原因時,我們可以把GC日志都打印出來,然后去分析gc日志中的關鍵性指標。

通過增加JVM參數的方式打印gc日志:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./gc.log

GC日志中會把每一次GC的情況都打印出來,因此所有的GC都可以被分析到。

在GC日志中,有關GC日志的參數,我接下來也會專門寫一篇來介紹,這樣更加能讓大家更加清楚一些。

我們還可以用一些工具比如GCeasy幫助我們去分析GC日志的情況。

“怎么使用JVM調優技術”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

jvm
AI

和林格尔县| 马龙县| 玉林市| 财经| 托里县| 昆明市| 瑞金市| 五寨县| 巴南区| 昆山市| 玛纳斯县| 德州市| 英吉沙县| 普陀区| 大厂| 赤城县| 桂林市| 兴仁县| 中西区| 榆社县| 长子县| 阿拉善右旗| 泸州市| 沈丘县| 红安县| 郴州市| 宝应县| 汪清县| 拜泉县| 奇台县| 铜梁县| 崇仁县| 石林| 登封市| 长子县| 武隆县| 信丰县| 文山县| 土默特左旗| 黎城县| 莲花县|