一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java中垃圾回收器GC對(duì)吞吐量的影響測(cè)試

Java中垃圾回收器GC對(duì)吞吐量的影響測(cè)試

2019-11-29 16:06junjie JAVA教程

這篇文章主要介紹了Java中垃圾回收器GC對(duì)吞吐量的影響測(cè)試,本文算是一個(gè)對(duì)垃圾回收器GC的優(yōu)化文章,需要的朋友可以參考下

在看內(nèi)存管理術(shù)語(yǔ)表的時(shí)候偶然發(fā)現(xiàn)了”Pig in the Python(注:有點(diǎn)像中文里的貪心不足蛇吞象)”的定義,于是便有了這篇文章。表面上看,這個(gè)術(shù)語(yǔ)說(shuō)的是GC不停地將大對(duì)象從一個(gè)分代提升到另一個(gè)分代的情景。這么做就好比巨蟒整個(gè)吞食掉它的獵物,以至于它在消化的時(shí)候都沒(méi)辦法移動(dòng)了。

在接下來(lái)的這24個(gè)小時(shí)里我的頭腦中充斥著這個(gè)令人窒息的巨蟒的畫(huà)面,揮之不去。正如精神病醫(yī)生所說(shuō)的,消除恐懼最好的方法就是說(shuō)出來(lái)。于是便有了這篇文章。不過(guò)接下的故事我們要講的不是蟒蛇,而是GC的調(diào)優(yōu)。我對(duì)天發(fā)誓。

大家都知道GC暫停很容易造成性能瓶頸。現(xiàn)代JVM在發(fā)布的時(shí)候都自帶了高級(jí)的垃圾回收器,不過(guò)從我的使用經(jīng)驗(yàn)來(lái)看,要找出某個(gè)應(yīng)用最優(yōu)的配置真是難上加難。手動(dòng)調(diào)優(yōu)或許仍有一線希望,但是你得了解GC算法的確切機(jī)制才行。關(guān)于這點(diǎn),本文倒是會(huì)對(duì)你有所幫助,下面我會(huì)通過(guò)一個(gè)例子來(lái)講解JVM配置的一個(gè)小的改動(dòng)是如何影響到你的應(yīng)用程序的吞吐量的。

示例

我們用來(lái)演示GC對(duì)吞吐量產(chǎn)生影響的應(yīng)用只是一個(gè)簡(jiǎn)單的程序。它包含兩個(gè)線程:

PigEater – 它會(huì)模仿巨蟒不停吞食大肥豬的過(guò)程。代碼是通過(guò)往java.util.List中添加 32MB字節(jié)來(lái)實(shí)現(xiàn)這點(diǎn)的,每次吞食完后會(huì)睡眠100ms。
PigDigester – 它模擬異步消化的過(guò)程。實(shí)現(xiàn)消化的代碼只是將豬的列表置為空。由于這是個(gè)很累的過(guò)程,因此每次清除完引用后這個(gè)線程都會(huì)睡眠2000ms。
兩個(gè)線程都會(huì)在一個(gè)while循環(huán)中運(yùn)行,不停地吃了消化直到蛇吃飽為止。這大概得吃掉5000頭豬。

 

復(fù)制代碼代碼如下:


package eu.plumbr.demo;

 

public class PigInThePython {
  static volatile List pigs = new ArrayList();
  static volatile int pigsEaten = 0;
  static final int ENOUGH_PIGS = 5000;

  public static void main(String[] args) throws InterruptedException {
    new PigEater().start();
    new PigDigester().start();
  }

  static class PigEater extends Thread {

    @Override
    public void run() {
      while (true) {
        pigs.add(new byte[32 * 1024 * 1024]); //32MB per pig
        if (pigsEaten > ENOUGH_PIGS) return;
        takeANap(100);
      }
    }
  }

  static class PigDigester extends Thread {
    @Override
    public void run() {
      long start = System.currentTimeMillis();

      while (true) {
        takeANap(2000);
        pigsEaten+=pigs.size();
        pigs = new ArrayList();
        if (pigsEaten > ENOUGH_PIGS)  {
          System.out.format("Digested %d pigs in %d ms.%n",pigsEaten, System.currentTimeMillis()-start);
          return;
        }
      }
    }
  }

  static void takeANap(int ms) {
    try {
      Thread.sleep(ms);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

 

現(xiàn)在我們將這個(gè)系統(tǒng)的吞吐量定義為“每秒可以消化的豬的頭數(shù)”。考慮到每100ms就會(huì)有豬被塞到這條蟒蛇里,我們可以看到這個(gè)系統(tǒng)理論上的最大吞吐量可以達(dá)到10頭/秒。

GC配置示例

我們來(lái)看下使用兩個(gè)不同的配置系統(tǒng)的表現(xiàn)分別是什么樣的。不管是哪個(gè)配置,應(yīng)用都運(yùn)行在一臺(tái)擁有雙核,8GB內(nèi)存的Mac(OS X10.9.3)上。

第一個(gè)配置:

1.4G的堆(-Xms4g -Xmx4g)
2.使用CMS來(lái)清理老年代(-XX:+UseConcMarkSweepGC)使用并行回收器清理新生代(-XX:+UseParNewGC)
3.將堆的12.5%(-Xmn512m)分配給新生代,并將Eden區(qū)和Survivor區(qū)的大小限制為一樣的。
第二個(gè)配置則略有不同:

1.2G的堆(-Xms2g -Xms2g)
2.新生代和老年代都使用Parellel GC(-XX:+UseParallelGC)
3.將堆的75%分配給新生代(-Xmn 1536m)
4.現(xiàn)在是該下注的時(shí)候了,哪個(gè)配置的表現(xiàn)會(huì)更好一些(就是每秒能吃多少豬,還記得吧)?那些把籌碼放到第一個(gè)配置上的家伙,你們一定會(huì)失望的。結(jié)果正好相反:

1.第一個(gè)配置(大堆,大的老年代,CMS GC)每秒能吞食8.2頭豬
2.第二個(gè)配置(小堆,大的新生代,Parellel GC)每秒可以吞食9.2頭豬

現(xiàn)在我們來(lái)客觀地看待一下這個(gè)結(jié)果。分配的資源少了2倍但吞吐量提升了12%。這和常識(shí)正好相反,因此有必要進(jìn)一步分析下到底發(fā)生了什么。

分析GC的結(jié)果

原因其實(shí)并不復(fù)雜,你只要仔細(xì)看一下運(yùn)行測(cè)試的時(shí)候GC在干什么就能發(fā)現(xiàn)答案了。這個(gè)你可以自己選擇要使用的工具。在jstat的幫助下我發(fā)現(xiàn)了背后的秘密,命令大概是這樣的:

復(fù)制代碼代碼如下:

jstat -gc -t -h20 PID 1s

 

通過(guò)分析數(shù)據(jù),我注意到配置1經(jīng)歷了1129次GC周期(YGCT_FGCT),總共花了63.723秒:

 

復(fù)制代碼代碼如下:


Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
594.0 174720.0 174720.0 163844.1  0.0   174848.0 131074.1 3670016.0  2621693.5  21248.0 2580.9   1006   63.182  116 0.236   63.419
595.0 174720.0 174720.0 163842.1  0.0   174848.0 65538.0  3670016.0  3047677.9  21248.0 2580.9   1008   63.310  117 0.236   63.546
596.1 174720.0 174720.0 98308.0 163842.1 174848.0 163844.2 3670016.0   491772.9  21248.0 2580.9   1010   63.354  118 0.240   63.595
597.0 174720.0 174720.0  0.0   163840.1 174848.0 131074.1 3670016.0   688380.1  21248.0 2580.9   1011   63.482  118 0.240   63.723

 

 

 

第二個(gè)配置一共暫停了168次(YGCT+FGCT),只花了11.409秒。

 

復(fù)制代碼代碼如下:

Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
539.3 164352.0 164352.0  0.0    0.0   1211904.0 98306.0   524288.0   164352.2  21504.0 2579.2 27    2.969  141 8.441   11.409
540.3 164352.0 164352.0  0.0    0.0   1211904.0 425986.2  524288.0   164352.2  21504.0 2579.2 27    2.969  141 8.441   11.409
541.4 164352.0 164352.0  0.0    0.0   1211904.0 720900.4  524288.0   164352.2  21504.0 2579.2 27    2.969  141 8.441   11.409
542.3 164352.0 164352.0  0.0 0.0   1211904.0 1015812.6  524288.0   164352.2  21504.0 2579.2 27 2.969  141 8.441   11.409

 

考慮到兩種情況下的工作量是等同的,因此——在這個(gè)吃豬的實(shí)驗(yàn)中當(dāng)GC沒(méi)有發(fā)現(xiàn)長(zhǎng)期存活的對(duì)象時(shí),它能更快地清理掉垃圾對(duì)象。而采用第一個(gè)配置的話,GC運(yùn)行的頻率大概會(huì)是6到7倍之多,而總的暫停時(shí)間則是5至6倍。

說(shuō)這個(gè)故事有兩個(gè)目的。第一個(gè)也是最主要的一個(gè),我希望把這條抽風(fēng)的蟒蛇趕緊從我的腦海里趕出去。另一個(gè)更明顯的收獲就是——GC調(diào)優(yōu)是個(gè)很需要技巧的經(jīng)驗(yàn)活,它需要你對(duì)底層的這些概念了如指掌。盡管本文中用到的這個(gè)只是很平常的一個(gè)應(yīng)用,但選擇的不同結(jié)果也會(huì)對(duì)你的吞吐量和容量規(guī)劃產(chǎn)生很大的影響。在現(xiàn)實(shí)生活中的應(yīng)用里面,這里的區(qū)別則會(huì)更為巨大。因此,就看你如何抉擇了,你可以去掌握這些概念,或者,只關(guān)注你日常的工作就好了,讓Plumbr來(lái)找出你所需要的最合適的GC配置吧。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 校园刺激全黄H全肉细节文 校草让我脱了内裤给全班看 | 国产精品久久久精品日日 | 三上悠亚精品专区久久 | 99热资源 | 欧美日韩国产精品va | 无码人妻少妇色欲AV一区二区 | 国产成人精品实拍在线 | 日韩porn| 亚洲激情综合 | 国产v在线在线观看羞羞答答 | 欧美乱妇高清无乱码视频在线 | 色婷婷婷丁香亚洲综合不卡 | 国产馆在线观看免费的 | 国语自产拍在线观看7m | 暴露狂婷婷 | 星星动漫在线观看免费 | 大学生情侣在线 | 精品国产品香蕉在线观看75 | 国产精品毛片无码 | 日韩一区二区三区免费 | 欧美性一区二区三区 | 免费观看视频在线 | 亚洲无人区乱码中文字幕 | 欧美精品1区 | 欧乱色国产精品兔费视频 | 亚洲人成伊人成综合网久久 | freesex1718处xx| 亚洲欧美综合区自拍另类 | 99在线精品视频 | 亚洲色图色 | 黑人巨大精品战中国美女 | av中文字幕网免费观看 | 亚洲午夜久久久久影院 | 69热视频| 私人影院免费观看 | 色综合久久天天综合 | 欧美专区亚洲 | 免费精品国产在线观看 | 国语对白做受xxxx | 91污无限制破解安卓2021 | 亚洲国产区男人本色在线观看欧美 |