日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入浅出JVM调优,看完你就懂

發(fā)布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出JVM调优,看完你就懂 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

深入淺出JVM調(diào)優(yōu)

基本概念:

JVM把內(nèi)存區(qū)分為堆區(qū)(heap)、棧區(qū)(stack)和方法區(qū)(method)。由于本文主要講解JVM調(diào)優(yōu),因此我們可以簡單的理解為,JVM中的堆區(qū)中存放的是實際的對象,是需要被GC的。其他的都無需GC。

下圖文JVM的內(nèi)存模型

從圖中我們可以看到,

1、JVM實質(zhì)上分為三大塊,年輕代(YoungGen),年老代(Old Memory),及持久代(Perm,在Java8中被取消,我們不做深入介紹)。

2、垃圾回收GC,分為2種,一是Minor GC,可以可以稱為YGC,即年輕代GC,當(dāng)Eden區(qū),還有一種稱為Major GC,又稱為FullGC。

3、GC原理:

我們可以看到年輕代包括Eden區(qū)(對象剛被new出來的時候,放到該區(qū)),S0和S1,是幸存者1區(qū)和幸存者2區(qū),從名字可以看出,是當(dāng)發(fā)生YGC,沒有被任何其他對象所引用的對象將會從內(nèi)存中被清除,還被其他對象引用的則放到幸存者區(qū)。當(dāng)發(fā)生多次YGC,在S0、S1區(qū)多次沒有被清楚的對象,則會被移到老年代區(qū)域。當(dāng)老年代區(qū)域被占滿的時候,則會發(fā)送FullGC。

無論是YGC或是FullGC,都會導(dǎo)致stop-the-world,即整個程序停止一些事務(wù)的處理,只有GC進(jìn)程允許以進(jìn)行垃圾回收,因此如果垃圾回收時間較長,部分web或socket程序,當(dāng)終端連接的時候會報connetTimeOut或readTimeOut異常,

4、從JVM調(diào)優(yōu)的角度來看,我們應(yīng)該盡量避免發(fā)生YGC或FullGC,或者使得YGC和FullGC的時間足夠的短。

JMV調(diào)優(yōu)的準(zhǔn)備工作。

1)、配置jstatd的遠(yuǎn)程RMI服務(wù)(當(dāng)我們要看遠(yuǎn)程服務(wù)器上JAVA程序的GC情況的時候,需要執(zhí)行此步驟),允許JVM工具查看JVM使用情況。

將如下的代碼存為文件 jstatd.all.policy,放到JAVA_HOME/bin中,其內(nèi)容如下:不知道JAVA_HOME目錄的,可以執(zhí)行 which java查看。

grant codebase “file:${java.home}/…/lib/tools.jar” {

permission java.security.AllPermission;

};

執(zhí)行命令jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=10.27.20.38 &

(10.27.20.38為你服務(wù)器的ip地址,&表示用守護(hù)線程的方式運行)

2)、執(zhí)行C:glassfish4jdk7injvisualvm.exe 打開JVM控制臺。

工具–插件–中找到Visual GC插件進(jìn)行安裝.

3)、對要執(zhí)行java程序進(jìn)行調(diào)優(yōu),以 c1000k.jar為例,在該jar包所在目錄下建立一個start.sh文件,文件內(nèi)容如下。

java -server -Xms4G -Xmx4G -Xmn2G -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar c1000k.jar&

通過這樣的配置,使用JVM控制臺即可查看JVM(CPU/內(nèi)存)及垃圾回收的情況。

4)、控制臺配置

打開jvisualvm.exe,遠(yuǎn)程—添加遠(yuǎn)程主機—輸入遠(yuǎn)程IP----添加JMX連接

5)、下面開始正式的JVM調(diào)優(yōu)。

5.1 JVM調(diào)優(yōu)核心為調(diào)整年輕代、年老大的內(nèi)存空間大小及使用GC發(fā)生器的類型等。回到上文的start.sh文件內(nèi)容,我們來分下:

java -server -Xms4G -Xmx4G -Xmn2G -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar c1000k.jar&

這臺機器是一個4G內(nèi)存的機器,因此:

-Xms4G 是指: JVM啟動時整個堆(包括年輕代,年老代)的初始化大小。

-Xmx4G 是指: JVM啟動時整個堆的最大值。

-Xmn2G是指:年輕代的空間大小,剩下的是年老代的空間。

-XX:SurvivorRatio=1是指:年輕代空間中2個Survivor空間與Eden空間的大小比例。此處為1:1:1,算法如下:比如整個年輕代空間為2G,如果比例為1,那么2/3,則S0/S1/Eden的空間大小是同樣的,為666M。

該值不設(shè)置,則JDK默認(rèn)為比例為8,那么是1:1:8,通過上面的算法可以得出S0/S1的大小。我們可以看到官方通過增大Eden區(qū)的大小,來減少YGC發(fā)生的次數(shù),但有時我們發(fā)現(xiàn),雖然次數(shù)減少了,但Eden區(qū)滿

的時候,由于占用的空間較大,導(dǎo)致釋放緩慢,此時stop-the-world的時間較長,因此需要按照程序情況去調(diào)優(yōu)。

-XX:+UseConcMarkSweepGC是指:使用GC的回收類型。這里是CMS類型,JDK1.7以后推薦使用+UseG1GC,被稱為G1類型(或Garbage First)的回收器。

5.2當(dāng)我們設(shè)定好start.sh的參數(shù)值后,執(zhí)行./start.sh此時就啟動了。

我們可以通過jvisualvm.exe中的Visual GC插件查看GC的圖形,我們也可以再服務(wù)器上執(zhí)行:jstat -gc 15016 1000,看到每1秒鐘java進(jìn)程號為15016的GC回收情況。

[root@yxdevapp04 c1000k]# jstat -gc 15016 1000

S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT

699008.0 699008.0 29980.4 0.0 699136.0 116881.6 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272

699008.0 699008.0 29980.4 0.0 699136.0 118344.8 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272

699008.0 699008.0 29980.4 0.0 699136.0 119895.5 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272

699008.0 699008.0 29980.4 0.0 699136.0 121383.1 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272

解釋如下:

S0C 是指:Survivor0區(qū)的分配空間

S0U 是指:Survivor1區(qū)的已經(jīng)使用的空間

EC是指:Eden區(qū)所使用的空間

EU是指:Eden區(qū)當(dāng)前使用的空間

OC是指:老年代分配的空間

OU是指:老年代當(dāng)前使用的空間

PC是指:持久待分配的空間

PU是指:持久待當(dāng)前使用的空間

YGC是指:年輕代發(fā)生的次數(shù),這里是354次

YGCT是指:年輕代發(fā)送的總時長,這里是54.272秒,因此每次年輕代發(fā)生GC,即平均每次stop-the-world的時長為54.272/354=0.153秒。

FGC是指:年老代回收的次數(shù),或者成為FullGC的次數(shù)。

FGCT是指:年老代發(fā)生回收的總時長。

GCT是指:包括年輕代YGC及年老代FGC的總時間長。

通常結(jié)合圖形或數(shù)據(jù),我們可以看到當(dāng)EU即將等于EC的時候,此時發(fā)生YGC,因此YGC次數(shù)+1,YGCT時間增加。

經(jīng)過實際的調(diào)優(yōu)測試我們發(fā)現(xiàn),當(dāng)發(fā)生YGC的時候,如果S0U或S1U區(qū)如果有任意一個區(qū)域為0的時候,此時YGC的速度很快,相反如果S0U或者S1U中都有數(shù)據(jù),或相對滿的時候,此時YGC的時間邊長,這就是因為S0/S1及Eden區(qū)的比例問題導(dǎo)致的。

5.3經(jīng)過一定時間的調(diào)優(yōu),我們基本上可以使得YGC的次數(shù)非常少,時間非常快,很長時間,數(shù)天都不會發(fā)生FGC,此時JVM的調(diào)優(yōu)算是一個好的結(jié)果。

5.4 在MAC電腦上可以通過jconsole調(diào)出圖形化分析工具。

總結(jié)

以上是生活随笔為你收集整理的深入浅出JVM调优,看完你就懂的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。