<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-86  評(píng)論-33  文章-0  trackbacks-0
    Hot Spot JVM5中的GC調(diào)優(yōu)

    Written by Halatu Hubisi


    引言
    有JAVA開發(fā)經(jīng)驗(yàn)的朋友們一定碰到過下面的這種情況,那就是自己所開發(fā)的應(yīng)用運(yùn)行了一段時(shí)間后其性能或者響應(yīng)速度會(huì)有明顯的降低.這是由多方面的原因造成的即有程序本身的優(yōu)化問題,也有運(yùn)行環(huán)境問題.此運(yùn)行環(huán)境即包括硬件環(huán)境也包括軟件環(huán)境.大多數(shù)人第一個(gè)能想到的解決方法是提升硬件的配置而忽略了程序本身的運(yùn)行環(huán)境JVM也提供了比較多的調(diào)優(yōu)選項(xiàng).本文將重點(diǎn)描述利用JVM的一些選項(xiàng)對(duì)GC進(jìn)行調(diào)優(yōu).

    約定:
    1.讀者應(yīng)具備一定JAVA的知識(shí).

    2.本文中的JVM選項(xiàng)均以SUN公司發(fā)布的HotSpot JVM 5為準(zhǔn)(不過大多數(shù)的選項(xiàng)在JVM1.3,JVM1.4中也是可用的).

    3.以JAVA_HOME下demo/jfc/SwingSet2/SwingSet2.jar為例進(jìn)行說(shuō)明.

    4.閱讀本文需要一些關(guān)于GC的知識(shí),可以到附錄A中了解這些知識(shí)。

    關(guān)鍵字:
    JVM(java虛擬機(jī)),調(diào)優(yōu),GC(垃圾回收)

    JVM GC調(diào)優(yōu)
    為了能夠?qū)VM GC的調(diào)優(yōu)能夠使用在具體的實(shí)踐當(dāng)中,下面將利用若干個(gè)例子來(lái)說(shuō)明GC的調(diào)優(yōu).
    例1:Heap size 設(shè)置
    JVM堆的設(shè)置是指java程序運(yùn)行過程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置Heap size的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)可進(jìn)行設(shè)置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
    當(dāng)在JAVA_HOME下demo/jfc/SwingSet2/目錄下執(zhí)行下面的命令。
    java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar
    系統(tǒng)輸出為:

    Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
    Exception in thread 
    "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space
    Exception in thread 
    "Image Fetcher 1" java.lang.OutOfMemoryError: Java heap space
    Exception in thread 
    "Image Fetcher 2" java.lang.OutOfMemoryError: Java heap space


    除了這些異常信息外,還會(huì)發(fā)現(xiàn)程序的響應(yīng)速度變慢了。這說(shuō)明Heap size 設(shè)置偏小,GC占用了更多的時(shí)間,而應(yīng)用分配到的執(zhí)行時(shí)間較少。
    提示:在JVM中如果98%的時(shí)間是用于GC且可用的Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?br>將上面的命令換成以下命令執(zhí)行則應(yīng)用能夠正常使用,且未拋出任何異常。
    java -jar -Xmn4m -Xms16m -Xmx32m SwingSet2.jar
    提示:Heap Size 最大不要超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。

    例2:Young Generation(-Xmn)的設(shè)置
    在本例中看一下Young Generation的設(shè)置不同將有什么現(xiàn)象發(fā)生。
    假設(shè)將Young generation 的大小設(shè)置為4M ,即執(zhí)行java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar,屏幕輸出如下(節(jié)選)

    [GC [DefNew: 3968K->64K(4032K), 0.0923407 secs] 3968K->2025K(32704K), 0.0931870 secs]
    [GC [DefNew: 4021K
    ->64K(4032K), 0.0356847 secs] 5983K->2347K(32704K), 0.0365441 secs]
    [GC [DefNew: 3995K
    ->39K(4032K), 0.0090603 secs] 6279K->2372K(32704K), 0.0093377 secs]
    [GC [DefNew: 3992K
    ->23K(4032K), 0.0057540 secs] 6325K->2356K(32704K), 0.0060290 secs]
    [GC [DefNew: 3984K
    ->27K(4032K), 0.0013058 secs] 6317K->2360K(32704K), 0.0015888 secs]
    [GC [DefNew: 3981K
    ->59K(4032K), 0.0023307 secs] 6315K->2422K(32704K), 0.0026091 secs]


    將程序體制并將Young Generation的大小設(shè)置為8M,即執(zhí)行java -jar -verbose:gc -Xmn8m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar,屏幕輸出如下(節(jié)選)

    [GC [DefNew: 7808K->192K(8000K), 0.1016784 secs] 7808K->2357K(32576K), 0.1022834 secs]
    [GC [DefNew: 8000K
    ->70K(8000K), 0.0149659 secs] 10165K->2413K(32576K), 0.0152557 secs]
    [GC [DefNew: 7853K
    ->59K(8000K), 0.0069122 secs] 10196K->2403K(32576K), 0.0071843 secs]
    [GC [DefNew: 7867K
    ->171K(8000K), 0.0075745 secs] 10211K->2681K(32576K), 0.0078376 secs]
    [GC [DefNew: 7970K
    ->192K(8000K), 0.0201353 secs] 10480K->2923K(32576K), 0.0206867 secs]
    [GC [DefNew: 7979K
    ->30K(8000K), 0.1787079 secs] 10735K->4824K(32576K), 0.1790065 secs]


    那么根據(jù)GC輸出的信息(這里取第一行)做一下Minor收集的比較。可以看出兩次的Minor收集分別在Young generation中找回3904K(3968K->64K)和7616K(7808K->192K)而對(duì)于整個(gè)jvm則找回1943K(3968K->2025)和5451K(7808K->2357K)。第一種情況下Minor收集了大約50%(1943/3904)的對(duì)象,而另外的50%的對(duì)象則被移到了tenured generation。在第二中情況下Minor收集了大約72%的對(duì)象,只有不到30%的對(duì)象被移到了Tenured Generation.這個(gè)例子說(shuō)明此應(yīng)用在的Young generation 設(shè)置為4m時(shí)顯的偏小。
    提示:一般的Young Generation的大小是整個(gè)Heap size的1/4。Young generation的minor收集率應(yīng)一般在70%以上。當(dāng)然在實(shí)際的應(yīng)用中需要根據(jù)具體情況進(jìn)行調(diào)整。

    例3:Young Generation對(duì)應(yīng)用響應(yīng)的影響
    還是使用-Xmn4m 和-Xmn8m進(jìn)行比較,先執(zhí)行下面的命令

    java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime SwingSet2.jar
    屏幕輸出如下(節(jié)選)

    Application time: 0.5114944 seconds
    [GC [DefNew: 3968K
    ->64K(4032K), 0.0823952 secs] 3968K->2023K(32704K), 0.0827626 secs]
    Total time 
    for which application threads were stopped: 0.0839428 seconds
    Application time: 
    0.9871271 seconds
    [GC [DefNew: 4020K
    ->64K(4032K), 0.0412448 secs] 5979K->2374K(32704K), 0.0415248 secs]
    Total time 
    for which application threads were stopped: 0.0464380 seconds


    Young Generation 的Minor收集占用的時(shí)間可以計(jì)算如下:應(yīng)用線程被中斷的總時(shí)常/(應(yīng)用執(zhí)行總時(shí)?L+應(yīng)用線程被中斷的總時(shí)常),那么在本例中垃圾收集占用的時(shí)?L約為系統(tǒng)的5%~14%。那么當(dāng)垃圾收集占用的時(shí)間的比例越大的時(shí)候,系統(tǒng)的響應(yīng)將越慢。
    提示:對(duì)于互聯(lián)網(wǎng)應(yīng)用系統(tǒng)的響應(yīng)稍微慢一些,用戶是可以接受的,但是對(duì)于GUI類型的應(yīng)用響應(yīng)速度慢將會(huì)給用戶帶來(lái)非常不好的體驗(yàn)。

    例4:如何決定Tenured Generation 的大小
    分別以-Xmn8m -Xmx32m和-Xmn8m -Xmx64m進(jìn)行對(duì)比,先執(zhí)行
    java -verbose:gc -Xmn8m -Xmx32m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java類,命令行將提示(只提取了Major收集)

    111.042: [GC 111.042: [DefNew: 8128K->8128K(8128K), 0.0000505 secs]111.042: [Tenured: 18154K->2311K(24576K), 0.1290354 secs] 26282K->2311K(32704K), 0.1293306 secs]
    122.463: [GC 122.463: [DefNew: 8128K->8128K(8128K), 0.0000560 secs]122.463: [Tenured: 18630K->2366K(24576K), 0.1322560 secs] 26758K->2366K(32704K), 0.1325284 secs]
    133.896: [GC 133.897: [DefNew: 8128K->8128K(8128K), 0.0000443 secs]133.897: [Tenured: 18240K->2573K(24576K), 0.1340199 secs] 26368K->2573K(32704K), 0.1343218 secs]
    144.112: [GC 144.112: [DefNew: 8128K->8128K(8128K), 0.0000544 secs]144.112: [Tenured: 16564K->2304K(24576K), 0.1246831 secs] 24692K->2304K(32704K), 0.1249602 secs]


    再執(zhí)行java -verbose:gc -Xmn8m -Xmx64m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java類,命令行將提示(只提取了Major收集)

    90.597: [GC 90.597: [DefNew: 8128K->8128K(8128K), 0.0000542 secs]90.597: [Tenured: 49841K->5141K(57344K), 0.2129882 secs] 57969K->5141K(65472K), 0.2133274 secs]
    120.899: [GC 120.899: [DefNew: 8128K->8128K(8128K), 0.0000550 secs]120.899: [Tenured: 50384K->2430K(57344K), 0.2216590 secs] 58512K->2430K(65472K), 0.2219384 secs]
    153.968: [GC 153.968: [DefNew: 8128K->8128K(8128K), 0.0000511 secs]153.968: [Tenured: 51164K->2309K(57344K), 0.2193906 secs] 59292K->2309K(65472K), 0.2196372 secs]


    可以看出在Heap size 為32m的時(shí)候系統(tǒng)等候時(shí)間約為0.13秒左右,而設(shè)置為64m的時(shí)候等候時(shí)間則增大到0.22秒左右了。但是在32m的時(shí)候系統(tǒng)的Major收集間隔為10秒左右,而Heap size 增加到64m的時(shí)候?yàn)?0秒。那么應(yīng)用在運(yùn)行的時(shí)候是選擇32m還是64m呢?如果應(yīng)用是web類型(即要求有大的吞吐量)的應(yīng)用則使用64m(即heapsize大一些)的比較好。對(duì)于要求實(shí)時(shí)響應(yīng)要求較高的場(chǎng)合(例如GUI型的應(yīng)用)則使用32m比較好一些。
    注意:
    1。因?yàn)樵贘VM5運(yùn)行時(shí)已經(jīng)對(duì)Heap-size進(jìn)行了優(yōu)化,所以在能確定java應(yīng)用運(yùn)行時(shí)不會(huì)超過默認(rèn)的Heap size的情況下建議不要對(duì)這些值進(jìn)行修改。
    2。Heap size的 -Xms -Xmn 設(shè)置不要超出物理內(nèi)存的大小。否則會(huì)提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。

    例5:如何縮短minor收集的時(shí)間
    下面比較一下采用-XX:+UseParNewGC選項(xiàng)和不采用它的時(shí)候的minor收集將有什么不同。先執(zhí)行
    java -jar -server -verbose:gc -Xmn8m -Xms32m -Xmx32m SwingSet2.jar
    系統(tǒng)將輸出如下信息(片段〕

    [GC 7807K->2641K(32576K), 0.0676654 secs]
    [GC 10436K
    ->3108K(32576K), 0.0245328 secs]
    [GC 10913K
    ->3176K(32576K), 0.0072865 secs]
    [GC 10905K
    ->4097K(32576K), 0.0223928 secs]


    之后再執(zhí)行 java -jar -server -verbose:gc -XX:+UseParNewGC -Xmn8m -Xms32m -Xmx32m SwingSet2.jar
    系統(tǒng)將輸出如下信息(片段〕

    [ParNew 7808K->2656K(32576K), 0.0447687 secs]
    [ParNew 10441K
    ->3143K(32576K), 0.0179422 secs]
    [ParNew 10951K
    ->3177K(32576K), 0.0031914 secs]
    [ParNew 10985K
    ->3867K(32576K), 0.0154991 secs]

    很顯然使用了-XX:+UseParNewGC選項(xiàng)的minor收集的時(shí)間要比不使用的時(shí)候優(yōu)。

    例6:如何縮短major收集的時(shí)間
    下面比較一下采用-XX:+UseConcMarkSweepGC選項(xiàng)和不采用它的時(shí)候的major收集將有什么不同。先執(zhí)行
    java -jar -verbose:gc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar
    系統(tǒng)將輸出如下信息(片段〕

    [Full GC 22972K->18690K(262080K), 0.2326676 secs]
    [Full GC 18690K
    ->18690K(262080K), 0.1701866 secs


    之后再執(zhí)行 java -jar -verbose:gc -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar
    系統(tǒng)將輸出如下信息(片段〕
    [Full GC 56048K->18869K(260224K), 0.3104852 secs]
    提示:此選項(xiàng)在Heap Size 比較大而且Major收集時(shí)間較長(zhǎng)的情況下使用更合適。

    例7:關(guān)于-server選項(xiàng) 在JVM中將運(yùn)行中的類認(rèn)定為server-class的時(shí)候使用此選項(xiàng)。SUN 的Hot Spot JVM5 如果判斷到系統(tǒng)的配置滿足如下條件則自動(dòng)將運(yùn)行的類認(rèn)定為server-class,并且會(huì)自動(dòng)設(shè)置jvm的選項(xiàng)(當(dāng)沒有手工設(shè)置這選項(xiàng)的時(shí)候〕而且HOTSPOT JVM5提供了自動(dòng)調(diào)優(yōu)的功能,他會(huì)根據(jù)JVM的運(yùn)行情況進(jìn)行調(diào)整。如果沒有特別的需要是不需要太多的人工干預(yù)的。SUN形象的稱這個(gè)機(jī)制為“人體工學(xué)”(Ergonomics〕。具體可以參考http://java.sun.com/docs/hotspot/gc5.0/ergo5.html
    *.具有2個(gè)或更多個(gè)物理的處理器
    *.具有2G或者更多的物理內(nèi)存
    提示:此選項(xiàng)要放在所有選項(xiàng)的前面。例如:java -server 其他選項(xiàng) java類

    附錄A:預(yù)備知識(shí)
    .JVM中對(duì)象的劃分及管理

    JVM根據(jù)運(yùn)行于其中的對(duì)象的生存時(shí)間大致的分為3種。并且將這3種不同的對(duì)象分別存放在JVM從系統(tǒng)分配到的不同的內(nèi)存空間。這種對(duì)象存放空間的管理方式叫做Generation管理方式。
    1。Young Generation:用于存放“早逝”對(duì)象(即瞬時(shí)對(duì)象)。例如:在創(chuàng)建對(duì)象時(shí)或者調(diào)用方法時(shí)使用的臨時(shí)對(duì)象或局部變量。
    2。Tenured Generation:用于存放“駐留”對(duì)象(即較長(zhǎng)時(shí)間被引用的對(duì)象)。往往體現(xiàn)為一個(gè)大型程序中的全局對(duì)象或長(zhǎng)時(shí)間被使用的對(duì)象。
    3。Perm Generation:用于存放“永久”對(duì)象。這些對(duì)象管理著運(yùn)行于JVM中的類和方法。

    .JVM選項(xiàng)的分類

    JVM有這么幾種選項(xiàng)供使用.
    1.供-X選項(xiàng)使用的項(xiàng)目,又稱為非標(biāo)準(zhǔn)選項(xiàng),不同廠商的此類型選項(xiàng)是有所不同的。例如:IBM的JVM用的一些選項(xiàng)在Sun的JVM中就不一定能生效。這種選項(xiàng)的使用方式如下:
    java -Xmn16m -Xms64m -Xmx64m java類名
    2.供-XX選項(xiàng)使用的項(xiàng)目,這種類型的選項(xiàng)可能要求有對(duì)系統(tǒng)信息訪問的權(quán)限。所以要慎用。這種選項(xiàng)的使用方式如下:
    java -XX:MaxHeapFreeRatio=70 -XX:+PrintGCDetails java類名
    3.java選項(xiàng)(即在命令行執(zhí)行java后提示的選項(xiàng)).
    java -server -verbose:gc -d64 java類名

    .垃圾收集分類

    在JVM中有兩種垃圾方式,一種叫做Minor(次收集),另一種叫做Major(主收集)。其中Minor在Young Generation的空間被對(duì)象全部占用后執(zhí)行,主要是對(duì)Young Generation中的對(duì)象進(jìn)行垃圾收集。而Major是針對(duì)于整個(gè)Heap size的垃圾收集。其中Minor方式的收集經(jīng)常發(fā)生,并且Minor收集所占用的系統(tǒng)時(shí)間小。Major方式的垃圾收集則是一種“昂貴”的垃圾收集方式,因?yàn)樵贛ajor要對(duì)整個(gè)Heap size進(jìn)行垃圾收集,這會(huì)使得應(yīng)用停頓的時(shí)間變得較長(zhǎng)。

    .GC信息的格式

    [GC [<collector>: <starting occupancy1> -> <ending occupancy1>, <pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3> secs]
    <collector> GC為minor收集過程中使用的垃圾收集器起的內(nèi)部名稱.
    <starting occupancy1> young generation 在進(jìn)行垃圾收集前被對(duì)象使用的存儲(chǔ)空間.
    <ending occupancy1> young generation 在進(jìn)行垃圾收集后被對(duì)象使用的存儲(chǔ)空間
    <pause time1> minor收集使應(yīng)用暫停的時(shí)間長(zhǎng)短(秒)
    <starting occupancy3> 整個(gè)堆(Heap Size)在進(jìn)行垃圾收集前被對(duì)象使用的存儲(chǔ)空間
    <ending occupancy3> 整個(gè)堆(Heap Size)在進(jìn)行垃圾收集后被對(duì)象使用的存儲(chǔ)空間
    <pause time3> 整個(gè)垃圾收集使應(yīng)用暫停的時(shí)間長(zhǎng)短(秒),包括major收集使應(yīng)用暫停的時(shí)間(如果發(fā)生了major收集).
    .GC信息的選項(xiàng)
    -XX:+PrintGCDetails 顯示GC的詳細(xì)信息
    -XX:+PrintGCApplicationConcurrentTime 打印應(yīng)用執(zhí)行的時(shí)間
    -XX:+PrintGCApplicationStoppedTime 打印應(yīng)用被暫停的時(shí)間
    提示:1.":"后的"+"號(hào)表示開啟此選項(xiàng),如果是"-"號(hào)那么表示關(guān)閉此選項(xiàng)。
         2.在不同的選項(xiàng)和不同的收集方式和類型下輸出的格式會(huì)有所不同。

    附錄B:HotSpot JVM 選項(xiàng)
    請(qǐng)參考JavaTM HotSpot VM Options

    附錄C:其他資源
    http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
    http://java.sun.com/docs/hotspot/gc5.0/ergo5.html

    posted on 2007-07-20 11:53 Derek.Guo 閱讀(1801) 評(píng)論(0)  編輯  收藏 所屬分類: Java
    MSN:envoydada@hotmail.com QQ:34935442
    主站蜘蛛池模板: 亚洲国产香蕉人人爽成AV片久久 | 亚洲最大黄色网站| 国产在线观看免费视频软件 | 免费a级毛片18以上观看精品| 在线看片人成视频免费无遮挡| 亚洲图片校园春色| 18勿入网站免费永久| 又爽又高潮的BB视频免费看 | 日韩免费无砖专区2020狼| 亚洲综合中文字幕无线码| 无码国产精品一区二区免费I6| 亚洲大香人伊一本线| 免费无码又爽又刺激高潮的视频| 亚洲va中文字幕| 免费亚洲视频在线观看| 人妻免费久久久久久久了| 亚洲日韩VA无码中文字幕| a级毛片在线视频免费观看 | 亚洲一卡二卡三卡四卡无卡麻豆| 18禁免费无码无遮挡不卡网站| 亚洲 欧洲 视频 伦小说| 国产成人aaa在线视频免费观看| 狼色精品人妻在线视频免费| 毛片免费全部播放无码| 亚洲一区动漫卡通在线播放| 四虎影院在线免费播放| 麻豆安全免费网址入口| 亚洲精品无码Av人在线观看国产| 污视频在线观看免费| 亚洲中文字幕精品久久| 亚洲成a人片在线播放| 日本免费高清视频| 亚洲一区二区三区在线观看蜜桃| 午夜老司机免费视频| 久久嫩草影院免费看夜色| 亚洲自偷自拍另类图片二区| 日韩在线视频免费看| 黄色免费在线网站| 亚洲色大成网站WWW国产| 亚洲综合精品香蕉久久网| 久久久久免费看黄A片APP|