真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

1.jvm的運(yùn)行參數(shù)

在jvm中有很多的參數(shù)可以進(jìn)行設(shè)置,這樣可以讓jvm在各種環(huán)境中都能夠高效的運(yùn)行。絕大部分的參數(shù)保持默認(rèn)即可。

我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、洱源ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的洱源網(wǎng)站制作公司

1.1 三種參數(shù)類(lèi)型

jvm的參數(shù)類(lèi)型分為三類(lèi),分別是 :
    標(biāo)準(zhǔn)參數(shù) :
        -help
        -version
    -X參數(shù)(非標(biāo)準(zhǔn)參數(shù))
        -Xint
        -Xcomp
    -XX參數(shù)(使用率較高)
        -XX:newSize
        -XX:+UseSerialGC        
1.1.1 -server與-clinet參數(shù)
可以通過(guò)-server或-client設(shè)置jvm的運(yùn)行參數(shù)。
    (1)它們的區(qū)別是Server VM的初始堆空間會(huì)大一些,默認(rèn)使用的是并行垃圾回收器,啟動(dòng)慢運(yùn)行快。
    (2)Client VM相對(duì)來(lái)講會(huì)保守一些,初始堆空間會(huì)小一些,使用串行的垃圾回收器,它的目標(biāo)是為了讓JVM的啟動(dòng)速度更快,但運(yùn)行速度會(huì)比Server VM模式慢些。
    (3)JVM在啟動(dòng)的時(shí)候會(huì)根據(jù)硬件和操作系統(tǒng)自動(dòng)選擇使用Server還是Client類(lèi)型的JVM。
    (4)32位操作系統(tǒng)
            1)如果是Windows系統(tǒng),不論硬件配置如何,都默認(rèn)使用Client類(lèi)型的JVM。
            2)如果是其他操作系統(tǒng)上,機(jī)器配置有2GB以上的內(nèi)存同時(shí)有2個(gè)以上CPU的話默認(rèn)使用server模式,否則使用client模式。
    (5)64位操作系統(tǒng)
            1)只有server類(lèi)型,不支持client類(lèi)型。       

2.1 -X參數(shù)

jvm的-X參數(shù)是非標(biāo)準(zhǔn)參數(shù),在不同版本的jvm中,參數(shù)可能會(huì)有所不同,可以通過(guò)java -X查看非標(biāo)準(zhǔn)參數(shù)。     
    -Xmixed:混合模式執(zhí)行(默認(rèn))
    -Xint:僅解釋模式執(zhí)行
    -Xbootclasspath:(用;分隔的目錄和zip/jar文件)設(shè)置搜索路徑以引導(dǎo)類(lèi)和資源
    -Xbootcalsspath/a:(用;分隔的目錄和zip/jar文件)   附加在引導(dǎo)類(lèi)路徑末尾
    -Xbootcalsspath/p:(用;分隔的目錄和zip/jar文件)置于引導(dǎo)類(lèi)路徑之前
    -Xdiag :顯示附加診斷消息
    -Xnoclassgc :禁用類(lèi)垃圾收集
    -Xincgc : 啟用增量垃圾收集
    -Xloggc: : 將GC狀態(tài)記錄在文件中(帶時(shí)間戳)
    -Xbatch :禁用后臺(tái)編譯
    -Xms : 設(shè)置初始java堆大小
    -Xmx : 設(shè)置最大java堆大小
    -Xss : 設(shè)置java線程堆棧大小
    -Xprof : 輸出cpu配置文件數(shù)據(jù)
    -Xfuture : 啟用最嚴(yán)格的檢查,預(yù)期將來(lái)的默認(rèn)值
    -Xrs : 減少java/VM 對(duì)操作系統(tǒng)信號(hào)的使用(請(qǐng)參閱文檔)
    -Xcheck:jni : 對(duì)JNI函數(shù)執(zhí)行其他檢查
    -Xshare:off : 不嘗試使用共享類(lèi)數(shù)據(jù)
    -Xshare:auto : 在可能的情況下使用共享類(lèi)數(shù)據(jù)(默認(rèn))
    -Xshare:on : 要求使用共享類(lèi)數(shù)據(jù),否則將失敗
    -XshowSettings:all : 顯示所有設(shè)置并繼續(xù)
    -XshowSettings:vm : 顯示所有與vm相關(guān)的設(shè)置并繼續(xù)
    -XshowSettings:properties : 顯示所有屬性設(shè)置并繼續(xù)
    -XshowSetting:locale : 顯示所有與區(qū)域設(shè)置相關(guān)的設(shè)置并繼續(xù)
2.1.1 -Xint、-Xcomp、-Xmixed
在解釋模式(interpreted mode)下,-Xint標(biāo)記會(huì)強(qiáng)制JVM執(zhí)行所有的字節(jié)碼,當(dāng)然這會(huì)降低運(yùn)行速度,通常低10倍或更多。
    (編譯比較快,運(yùn)行比較慢)
-Xcomp參數(shù)與它(-Xint)正好相反,JVM在第一次使用時(shí)會(huì)把所有的字節(jié)碼編譯成本地代碼,從而帶來(lái)最大程度的優(yōu)化。
    然而,很多應(yīng)用在使用-Xcomp也會(huì)有一些性能損失,當(dāng)然這比使用-Xint損失的少,原因是-Xcomp沒(méi)有讓JVM啟用JIT編譯器的全部功能。
    JIT編譯器可以對(duì)是否需要編譯做判斷,如果所有代碼都進(jìn)行編譯的話,對(duì)于一些只執(zhí)行一次的代碼就沒(méi)有意義了。
    (
-Xmixed是混合模式,將解釋模式與編譯模式進(jìn)行混合使用,由jvm自己決定,這是jvm默認(rèn)的模式,也是推薦使用的模式。            

3.1 -XX參數(shù)

-xx參數(shù)也是非標(biāo)準(zhǔn)參數(shù),主要用于jvm的調(diào)優(yōu)和debug操作。
-xx參數(shù)的使用有2種方式,一種是boolean類(lèi)型,一種是非boolean類(lèi)型:
    boolean類(lèi)型
        格式 :-xx:[+-] 表示啟用或禁用屬性
        如 :-xx:+DisableExplicitGC 表示禁用手動(dòng)調(diào)用gc操作,也就是說(shuō)調(diào)用System.gc()無(wú)效
    非boolean類(lèi)型
        格式 :-xx:= 表示屬性的值為
        如 :-xx:NewRatio=1 表示新生代和老年代的比值          

4.1 -Xms與-Xmx參數(shù)

-Xms與-Xmx分別是設(shè)置jvm的堆內(nèi)存的初始大小和最大大小。
-Xmx2048m : 等價(jià)于-XX:MaxHeapSize,設(shè)置JVM最大堆內(nèi)存為2048M。
-Xms512m :等價(jià)于-XX:InitialHeapSize,設(shè)置JVM初始堆內(nèi)存為512M。
適當(dāng)?shù)恼{(diào)整jvm的內(nèi)存大小,可以充分利用服務(wù)器資源,讓程序跑的更快。

5.1 查看jvm的運(yùn)行參數(shù)

有時(shí)候我們需要查看jvm的運(yùn)行參數(shù),這個(gè)需求可能會(huì)存在2中情況:
第一,運(yùn)行java命令時(shí)打印出運(yùn)行參數(shù);
第二,查看正在運(yùn)行的java進(jìn)程的參數(shù);
5.1.1 運(yùn)行java命令時(shí)打印參數(shù)
運(yùn)行java命令時(shí)打印參數(shù),需要添加-XX:+PrintFlagsFinal參數(shù)即可。 其中參數(shù)有boolean類(lèi)型和數(shù)字類(lèi)型,值的操作符是=或:=,分別
代表默認(rèn)值和被修改的值。
查看所有的參數(shù),用法 :jinfo -flags <進(jìn)程id>
通過(guò)jps 或者 jps -l 查看java進(jìn)程
查看某一參數(shù)的值,用法 :jinfo -flag <參數(shù)名> <進(jìn)程id>

6.1 jdk1.7的堆內(nèi)存模型

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

Young年輕區(qū)(代)
    Young區(qū)被劃分為三部分,Eden區(qū)和兩個(gè)大小嚴(yán)格相同的Survivor區(qū),其中,Survivor區(qū)間中,某一時(shí)刻只有其中一個(gè)是被
    使用的,另外一個(gè)留做垃圾收集時(shí)復(fù)制對(duì)象用,在Eden區(qū)間變滿的時(shí)候,GC就會(huì)將存活的對(duì)象移到空閑的Survivor區(qū)間中
    ,根據(jù)JVM的策略,在經(jīng)過(guò)幾次垃圾收集后,任然存活于Survivor的對(duì)象將被移動(dòng)到Tenured區(qū)間。
Tenured年老區(qū)
    Tenured區(qū)主要保存生命周期長(zhǎng)的對(duì)象,一般是一些老的對(duì)象,當(dāng)一些對(duì)象在Young復(fù)制轉(zhuǎn)移一定的次數(shù)以后,  對(duì)象就會(huì)被
    轉(zhuǎn)移到Tenured區(qū),一般如果系統(tǒng)中用了application級(jí)別的緩存,緩存中的對(duì)象往往會(huì)被轉(zhuǎn)移到這一區(qū)間。
Perm 永久區(qū)
    Perm代主要保存class,method,filed對(duì)象,這部分的空間一般不會(huì)溢出,除非一次性加載了很多的類(lèi),不過(guò)在涉及到熱部
    署的應(yīng)用服務(wù)器的時(shí)候,有時(shí)候會(huì)遇到j(luò)ava.lang.OutOfMemoryError : PermGen space的錯(cuò)誤,造成這個(gè)錯(cuò)誤的很大原因就
    有可能是每次都重新部署,但是重新部署后,類(lèi)的class沒(méi)有被卸載掉,這樣就造成了大量的class對(duì)象保存在了perm中,這
    種情況下,一般重新啟動(dòng)應(yīng)用服務(wù)器可以解決問(wèn)題。
Virtual區(qū)
    最大內(nèi)存和初始內(nèi)存的差值,就是Virtual區(qū)。
6.2 jdk1.8的堆內(nèi)存模型

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

由上圖可以看出,jdk1.8的內(nèi)存模型是由2部分組成,年輕代 + 年老代。
年輕代:Eden + 2 * Survivor
年老代:OldGen
在jdk1.8中變化最大的Perm區(qū),用Metaspace(元數(shù)據(jù)空間)進(jìn)行了替換。
需要特別說(shuō)明的是 :Metaspace所占用的內(nèi)存空間不是在虛擬機(jī)內(nèi)部,而是在本地內(nèi)存空間中,這也是與1.7的永久代最大的區(qū)別所在。
JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

6.3 為什么要廢棄1.7中的永久區(qū)?
移除永久代是為融合HotSpot JVM與JRockit VM而做出的努力,因?yàn)镴Rockit沒(méi)有永久代,不需要配置永久代。
現(xiàn)實(shí)使用中,由于永久代內(nèi)存經(jīng)常不夠用或發(fā)生內(nèi)存泄漏,爆出異常java.lang.OutOfMemoryError : PermGen.
基于此,將永久區(qū)廢棄,而改元空間,改為了使用本地內(nèi)存空間。
6.4 通過(guò)jstat命令進(jìn)行查看堆內(nèi)存使用情況
jstat命令可以查看堆內(nèi)存各部分的使用量,以及加載類(lèi)的數(shù)量。命令的格式如下 :
jstat[-命令選項(xiàng)][vmid][間隔時(shí)間/毫秒][查詢次數(shù)]
6.4.1 查看class加載統(tǒng)計(jì)

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

說(shuō)明 :
Loaded: 加載class的數(shù)量
Bytes: 所占用空間大小
Unloaded: 未加載數(shù)量
Bytes: 未加載占用空間
Time: 時(shí)間

6.4.2 查看編譯統(tǒng)計(jì)

jstat -compiler?
JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

說(shuō)明 :
Compiled: 編譯數(shù)量
Failed: 失敗數(shù)量
Invalid: 不可用數(shù)量
Time: 時(shí)間
FailedType: 失敗類(lèi)型
FailedMethod: 失敗的方法

6.4.3 垃圾回收統(tǒng)計(jì)

jstat -gc
JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

也可以指定打印的間隔和次數(shù),每1秒中打印一次,共打印5次
jstat -gc 1000 5
JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

說(shuō)明 :
S0C: 第一個(gè)Survivor區(qū)的大?。↘B)
S1C: 第二個(gè)Survivor區(qū)的大?。↘B)
S0U: 第一個(gè)Survivor區(qū)的使用大小(KB)
S1U: 第二個(gè)Survivor區(qū)的使用大?。↘B)
EC: Eden區(qū)的大?。↘B)
EU: Eden區(qū)的使用大小(KB)
OC: Old區(qū)大?。↘B)
OU: Old使用大?。↘B)
MC:方法區(qū)大?。↘B)
MU:方法區(qū)使用大小(KB)
CCSC:壓縮類(lèi)空間使用大?。↘B)
CCSU:壓縮類(lèi)空間使用大?。↘B)
YGC:年輕代垃圾回收次數(shù)
YGCT:年輕代垃圾回收消耗時(shí)間
FGC:老年代垃圾回收次數(shù)
FGCT: 老年代垃圾回收消耗時(shí)間
GCT:垃圾回收消耗總時(shí)間

7.1 查詢內(nèi)存使用情況

前面通過(guò)jstat可以對(duì)jvm堆的內(nèi)存進(jìn)行統(tǒng)計(jì)分析,而jmap可以獲取到更加詳細(xì)的內(nèi)容,如 :內(nèi)存使用情況的匯總、對(duì)內(nèi)存溢出的定位與分析。
查看內(nèi)存使用情況 :
jmap -heap 

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

7.2 查看內(nèi)存中對(duì)象數(shù)量及大小
查看所有對(duì)象,包括活躍以及非活躍的
jmap -histo  | more
查看活躍對(duì)象
jmap -histo:live  | more

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

對(duì)象說(shuō)明 :
B : byte
C : char
D : double
F : float
I : int
J : long
Z : boolean
[ : 數(shù)組,如[I表示int[]
[L+類(lèi)名 :其他對(duì)象

7.3 將內(nèi)存使用情況dump到文件中
有些時(shí)候我們需要將jvm當(dāng)前內(nèi)存中的情況dump到文件中,然后對(duì)它進(jìn)行分析,jmap也是支持dump到文件中的。
用法 :
jmap -dump:format=b,file=dumpFileName 
其中b是代表二進(jìn)制
示例 :
jmap -dump:format=b,file=/tmp/dump.dat 6219     
7.4 通過(guò)jhat對(duì)dump文件進(jìn)行分析
用法 :
jhat -port  
例如 :
jhat -port 9999 /test/dump.dat
這個(gè)時(shí)候就可以打開(kāi)瀏覽器訪問(wèn) :127.0.0.2:9999  
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError : 設(shè)置初始堆大小和當(dāng)發(fā)生內(nèi)存溢出時(shí),給內(nèi)存一個(gè)快照并導(dǎo)出一個(gè)dump文件 
用MAT進(jìn)行文件分析

8 jstack的使用

有些時(shí)候我們需要查看下jvm中的線程執(zhí)行情況,比如,發(fā)現(xiàn)服務(wù)器的CPU的負(fù)載突然增高了、出現(xiàn)了死鎖、死循環(huán)等,我們
如何分析呢?
由于程序是正常運(yùn)行的,沒(méi)有任何的輸出,從日志方面也看不出什么問(wèn)題,所以就需要看下jvm的內(nèi)部線程的執(zhí)行情況,然后
再進(jìn)行分析查找出原因。
這個(gè)時(shí)候,就需要借助于jstack命令了,jstack的作用是將正在運(yùn)行的jvm的線程情況進(jìn)行快照,并且打印出來(lái) :
用法 :jstack 

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

8.1 線程的狀態(tài)

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

在java中線程的狀態(tài)一共被分成6種 :
    初始態(tài)(NEW)
        創(chuàng)建一個(gè)Thread對(duì)象,但還未調(diào)用start()啟動(dòng)線程時(shí),線程處于初始態(tài)。
    運(yùn)行態(tài)(RUNNABLE),在java中,運(yùn)行態(tài)包括就緒態(tài)和運(yùn)行態(tài)。  
        就緒態(tài)
            該狀態(tài)下的線程已經(jīng)獲得執(zhí)行所需的所有資源,只要CPU分配執(zhí)行權(quán)就能運(yùn)行。
            所有就緒態(tài)的線程存放在就緒隊(duì)列中。
        運(yùn)行態(tài)
            獲得CPU執(zhí)行權(quán),正在執(zhí)行的線程。
            由于一個(gè)CPU同一時(shí)刻只能執(zhí)行一條線程,因此每個(gè)CPU每個(gè)時(shí)刻只有一條運(yùn)行態(tài)的線程。
    阻塞態(tài)(BLOCKED)
            當(dāng)一條正在執(zhí)行的線程請(qǐng)求某一資源失敗時(shí),就會(huì)進(jìn)入阻塞態(tài)。
            而在java中,阻塞態(tài)專(zhuān)指請(qǐng)求鎖失敗時(shí)進(jìn)入的狀態(tài)。
            由一個(gè)阻塞隊(duì)列存放所有阻塞態(tài)的線程。
            處于阻塞態(tài)的線程會(huì)不斷請(qǐng)求資源,一旦請(qǐng)求成功,就會(huì)進(jìn)入就緒隊(duì)列,等待執(zhí)行。
    等待態(tài)(WAITING)
            當(dāng)前線程中調(diào)用wait、join、park函數(shù)時(shí),當(dāng)前線程就會(huì)進(jìn)入等待態(tài)。
            也有一個(gè)等待隊(duì)列存放所有等待態(tài)的線程。
            線程處于等待態(tài)表示它需要等待其他線程的指示才能繼續(xù)運(yùn)行。
            進(jìn)入等待態(tài)的線程會(huì)釋放CPU執(zhí)行權(quán),并釋放資源(如 :鎖)。
    超時(shí)等待態(tài)(TIMED_WAITING)
            當(dāng)運(yùn)行中的線程調(diào)用sleep(time)、wait、join、parkNanos、parkUntil時(shí),就會(huì)進(jìn)入該狀態(tài);
            它和等待態(tài)一樣,并不是因?yàn)檎?qǐng)求不到資源,而是主動(dòng)進(jìn)入,并且進(jìn)入后需要其他線程喚醒;
            進(jìn)入該狀態(tài)后釋放CPU執(zhí)行權(quán)和占有的資源。
            與等待態(tài)的區(qū)別:到了超時(shí)時(shí)間后自動(dòng)進(jìn)入阻塞隊(duì)列,開(kāi)始競(jìng)爭(zhēng)鎖。
    終止態(tài)(TERMINATED)
            線程執(zhí)行結(jié)束后的狀態(tài)。
8.2 分析死鎖
在運(yùn)行的程序中,通過(guò)命令窗口查看當(dāng)前正在執(zhí)行的線程id         
jps
同通過(guò)jstack進(jìn)行分析 :
jstack 

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

在輸出的信息中,已經(jīng)看到,發(fā)現(xiàn)了1個(gè)死鎖,關(guān)鍵看這個(gè) :
JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一

可以清晰的看到 :
    Thread2 獲取了<0x00000000f655dc50>的鎖,等待獲取<0x00000000f655dc40>這個(gè)鎖
    Thread1 獲取了<0x00000000f655dc40>的鎖,等待獲取<0x00000000f655dc50>這個(gè)鎖
    由此可見(jiàn),發(fā)生了死鎖。
可以使用VisualVM工具進(jìn)行JVM問(wèn)題的排查
8.3 監(jiān)控遠(yuǎn)程的jvm
VisualJVM不僅是可以監(jiān)控本地jvm進(jìn)程,還可以監(jiān)控遠(yuǎn)程的jvm進(jìn)程,需要借助于JMX技術(shù)實(shí)現(xiàn)。
8.3.1 什么是JMX?
JMX(Java Management Extensions,即Java管理擴(kuò)展)是一個(gè)為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架,JMX可以跨越一系列操作
平臺(tái)、系統(tǒng)體系結(jié)構(gòu)和網(wǎng)絡(luò)傳輸協(xié)議,靈活的開(kāi)發(fā)無(wú)縫集成的系統(tǒng)、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用。
8.3.2 監(jiān)控遠(yuǎn)程的tomcat
想要監(jiān)控遠(yuǎn)程的tomcat,就需要在遠(yuǎn)程的tomcat進(jìn)行對(duì)JMX配置,方法如下 :
#在tomcat的bin目錄下,修改catalina.sh,添加如下的參數(shù)
JAVA_OPTS="
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9999 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmremote.ssl=false"                                                                
這幾個(gè)參數(shù)的意思是 :
#-Dcom.sun.management.jmxremote : 允許使用JMX遠(yuǎn)程管理
#-Dcom.sun.management.jmxremote.port=9999  : JMX遠(yuǎn)程連接端口
#-Dcom.sun.management.jmxremote.authenticate=false : 不進(jìn)行身份認(rèn)證,任何用戶都可以連接
#-Dcom.sun.management.jmremote.ssl=false : 不使用ssl
設(shè)置好以后保存,并重啟tomcat
./startup.sh && tail -f ../logs/catalina.out  :  重啟tomcat并顯示啟動(dòng)日志
通過(guò)VisualVM進(jìn)行遠(yuǎn)程連接。
SpringBoot項(xiàng)目是內(nèi)嵌的tomcat配置方式查看http://www.360doc.com/content/17/1018/20/16915_696185383.shtml

本文標(biāo)題:JVM史上最全實(shí)踐優(yōu)化沒(méi)有之一
網(wǎng)站路徑:http://weahome.cn/article/pgijsp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部