成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

怎么使用JVM調(diào)優(yōu)技術(shù)

本篇內(nèi)容介紹了“怎么使用JVM調(diào)優(yōu)技術(shù)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計、成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價值。

(一)調(diào)優(yōu)工具

1.1 jmap

查看實例個數(shù)以及占用內(nèi)存信息,最后一位表示進(jìn)程id,可以用jps命令查看

jmap -histo pid

怎么使用JVM調(diào)優(yōu)技術(shù)

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

查看堆的使用情況

jmap -heap pid

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

怎么使用JVM調(diào)優(yōu)技術(shù)

堆內(nèi)存dump

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

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

jvisualvm

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

怎么使用JVM調(diào)優(yōu)技術(shù)

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

怎么使用JVM調(diào)優(yōu)技術(shù)

通過Jvm參數(shù)可設(shè)置內(nèi)存溢出后自動導(dǎo)出Dump文件:

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

1.2 Jstack

通過Jstack命令加進(jìn)程的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命令查到進(jìn)程號,我這里是15820,接著使用jstack命令:

jstack 15820

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

怎么使用JVM調(diào)優(yōu)技術(shù)

1.3 Jinfo

查看正在運行的Java項目參數(shù) 查看jvm的參數(shù)

jinfo -flags pid

可以查看到j(luò)vm的所有參數(shù)

怎么使用JVM調(diào)優(yōu)技術(shù)

查看Java系統(tǒng)參數(shù)

jinfo -sysprops pid

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

1.4 jvisualvm

可視化的JVM監(jiān)控工具,上面所講到的這些命令,都可以直接在jvisualvm中看到可視化數(shù)據(jù),但是這個工具在生產(chǎn)環(huán)境中需要謹(jǐn)慎使用,因為會占用一定資源。

(三)Jstat

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

jstat命令可以查看堆內(nèi)存各部分的使用量,以及加載類的數(shù)量等。

2.1 垃圾回收統(tǒng)計

評估內(nèi)存使用及GC壓力情況

jstat -gc pid

我執(zhí)行這段代碼后,出現(xiàn)了一串?dāng)?shù)據(jù)

怎么使用JVM調(diào)優(yōu)技術(shù)

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

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

2.2 垃圾回收比例統(tǒng)計

給出各個區(qū)的使用比例:

jstat -gcutil pid

參數(shù)介紹:

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

2.3 堆內(nèi)存統(tǒng)計

統(tǒng)計堆內(nèi)存的使用情況

jstat -gccapacity pid

介紹一下參數(shù):

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

2.4 新生代垃圾回收統(tǒng)計

統(tǒng)計新生代垃圾回收的數(shù)據(jù)

jstat -gcnew pid

介紹參數(shù):

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

2.5 新生代內(nèi)存統(tǒng)計

統(tǒng)計新生代內(nèi)存的使用情況

jstat -gcnewcapacity pid

介紹參數(shù):

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

2.6 老年代垃圾回收統(tǒng)計

統(tǒng)計老年代垃圾回收的數(shù)據(jù)

jstat -gcold pid

參數(shù)介紹:

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

2.7 老年代內(nèi)存統(tǒng)計

統(tǒng)計老年代內(nèi)存的使用情況

jstat -gcoldcapacity pid

參數(shù)介紹:

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

2.8 元空間統(tǒng)計

統(tǒng)計元數(shù)據(jù)空間的情況

jstat -gcmetacapacity pid

參數(shù)介紹

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

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

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

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

我們都知道新對象的產(chǎn)生會在eden區(qū),因此我們可以通過下面的命令:

jstat -gc pid 5000 10

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

3.2 分析YGC情況

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

3.3 YGC后對象存活情況

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

3.4 分析FGC情況

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

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

(四)GC日志

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

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

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

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

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

我們還可以用一些工具比如GCeasy幫助我們?nèi)シ治鯣C日志的情況。

“怎么使用JVM調(diào)優(yōu)技術(shù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

網(wǎng)站標(biāo)題:怎么使用JVM調(diào)優(yōu)技術(shù)
當(dāng)前網(wǎng)址:http://jinyejixie.com/article46/ghhoeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計網(wǎng)站排名、外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
康乐县| 东海县| 旅游| 格尔木市| 德清县| 清镇市| 前郭尔| 五台县| 新沂市| 德兴市| 佛冈县| 尼勒克县| 安远县| 达州市| 昆明市| 阿拉善盟| 盘锦市| 佳木斯市| 慈溪市| 曲周县| 酒泉市| 扶风县| 义马市| 栾川县| 九江市| 西安市| 华池县| 宁武县| 怀化市| 延川县| 铜鼓县| 岳池县| 沁水县| 淮北市| 沂源县| 清远市| 江孜县| 南投市| 克什克腾旗| 光山县| 南通市|