第六篇 : Epsilon 垃圾收集器

一、簡(jiǎn)介

Epsilon(A No-Op Garbage Collector)垃圾回收器控制內(nèi)存分配橘忱,但是不執(zhí)行任何垃圾回收工作顷扩。一旦java的堆被耗盡火邓,jvm就直接關(guān)閉。設(shè)計(jì)的目的是提供一個(gè)完全消極的GC實(shí)現(xiàn)烂叔,分配有限的內(nèi)存分配谨胞,最大限度降低消費(fèi)內(nèi)存占用量和內(nèi)存吞吐時(shí)的延遲時(shí)間。一個(gè)好的實(shí)現(xiàn)是隔離代碼變化长已,不影響其他GC畜眨,最小限度的改變其他的JVM代碼。

二术瓮、使用場(chǎng)景

  • Performance testing,什么都不執(zhí)行的GC非常適合用于差異性分析。no-op GC可以用于過濾掉GC誘發(fā)的新能損耗贰健,比如GC線程的調(diào)度胞四,GC屏障的消耗,GC周期的不合適觸發(fā)伶椿,內(nèi)存位置變化等辜伟。此外有些延遲者不是由于GC引起的,比如scheduling hiccups, compiler transition hiccups脊另,所以去除GC引發(fā)的延遲有助于統(tǒng)計(jì)這些延遲导狡。
  • Memory pressure testing, 在測(cè)試java代碼時(shí),確定分配內(nèi)存的閾值有助于設(shè)置內(nèi)存壓力常量值偎痛。這時(shí)no-op就很有用旱捧,它可以簡(jiǎn)單地接受一個(gè)分配的內(nèi)存分配上限,當(dāng)內(nèi)存超限時(shí)就失敗踩麦。例如:測(cè)試需要分配小于1G的內(nèi)存枚赡,就使用-Xmx1g參數(shù)來配置no-op GC,然后當(dāng)內(nèi)存耗盡的時(shí)候就直接crash谓谦。
  • VM interface testing, 以VM開發(fā)視角贫橙,有一個(gè)簡(jiǎn)單的GC實(shí)現(xiàn),有助于理解VM-GC的最小接口實(shí)現(xiàn)反粥。它也用于證明VM-GC接口的健全性卢肃。
  • Extremely short lived jobs, 一個(gè)短聲明周期的工作可能會(huì)依賴快速退出來釋放資源,這個(gè)時(shí)候接收GC周期來清理heap其實(shí)是在浪費(fèi)時(shí)間才顿,因?yàn)閔eap會(huì)在退出時(shí)清理莫湘。并且GC周期可能會(huì)占用一會(huì)時(shí)間,因?yàn)樗蕾噃eap上的數(shù)據(jù)量娜膘。
  • Last-drop latency improvements, 對(duì)那些極端延遲敏感的應(yīng)用逊脯,開發(fā)者十分清楚內(nèi)存占用,或者是幾乎沒有垃圾回收的應(yīng)用竣贪,此時(shí)耗時(shí)較長(zhǎng)的GC周期將會(huì)是一件壞事军洼。
  • Last-drop throughput improvements, 即便對(duì)那些無需內(nèi)存分配的工作巩螃,選擇一個(gè)GC意味著選擇了一系列的GC屏障,所有的OpenJDK GC都是分代的匕争,所以他們至少會(huì)有一個(gè)寫屏障避乏。避免這些屏障可以帶來一點(diǎn)點(diǎn)的吞吐量提升。

三甘桑、案例

使用G1垃圾收集器

代碼:

public class TestEpsilon {

    public static void main(String[] args) {
        System.out.println("程序開始");
        boolean flag = true;
        List<Garbage> list = new ArrayList<>();
        long count = 0;
        while (flag) {
            list.add(new Garbage(list.size() + 1));
            if (list.size() == 1000000 && count == 0) {
                list.clear();
                count++;
            }
        }
        System.out.println("程序結(jié)束");
    }
}

class Garbage {

    private int number;

    public Garbage(int number) {
        this.number = number;
    }

    /**
     * GC在清除對(duì)象時(shí)拍皮,會(huì)調(diào)用finalize()方法
     */
    @Override
    public void finalize() {
        System.out.println(this + " : " + number + " is dying");
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

}

啟動(dòng)參數(shù):

-Xms100m -Xmx100m

運(yùn)行程序后,結(jié)果如下:

程序開始
...
com.gf.demo8.Garbage@15ddf76b : 305097 is dying
com.gf.demo8.Garbage@35e52705 : 305224 is dying
com.gf.demo8.Garbage@32c14bc1 : 305362 is dying
com.gf.demo8.Garbage@7521660a : 305705 is dying
com.gf.demo8.Garbage@f3da16a : 305948 is dying
com.gf.demo8.Garbage@13fc7287 : 306089 is dying
    at java.base/java.lang.ref.Finalizer.register(Finalizer.java:66)
    at java.base/java.lang.Object.<init>(Object.java:50)
    at com.gf.demo8.Garbage.<init>(TestEpsilon.java:28)
    at com.gf.demo8.TestEpsilon.main(TestEpsilon.java:14)
...

會(huì)發(fā)現(xiàn)G1一直回收對(duì)象跑杭,直到內(nèi)存不夠用铆帽。

使用Epsilon垃圾收集器

啟動(dòng)參數(shù):

UnlockExperimentalVMOptions:解鎖隱藏的虛擬機(jī)參數(shù)。

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xms100m -Xmx100m

運(yùn)行程序后德谅,結(jié)果如下:

程序開始
Terminating due to java.lang.OutOfMemoryError: Java heap space

會(huì)發(fā)現(xiàn)很快就內(nèi)存溢出了爹橱,因?yàn)镋psilon不會(huì)去回收對(duì)象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窄做,一起剝皮案震驚了整個(gè)濱河市愧驱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椭盏,老刑警劉巖组砚,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掏颊,居然都是意外死亡糟红,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蚯舱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改化,“玉大人,你說我怎么就攤上這事枉昏〕赂兀” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵兄裂,是天一觀的道長(zhǎng)句旱。 經(jīng)常有香客問我,道長(zhǎng)晰奖,這世上最難降的妖魔是什么谈撒? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮匾南,結(jié)果婚禮上啃匿,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好溯乒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布夹厌。 她就那樣靜靜地躺著,像睡著了一般裆悄。 火紅的嫁衣襯著肌膚如雪矛纹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天光稼,我揣著相機(jī)與錄音或南,去河邊找鬼。 笑死艾君,一個(gè)胖子當(dāng)著我的面吹牛采够,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冰垄,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吁恍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了播演?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤伴奥,失蹤者是張志新(化名)和其女友劉穎写烤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拾徙,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洲炊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尼啡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暂衡。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖崖瞭,靈堂內(nèi)的尸體忽然破棺而出狂巢,到底是詐尸還是另有隱情,我是刑警寧澤书聚,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布唧领,位于F島的核電站,受9級(jí)特大地震影響雌续,放射性物質(zhì)發(fā)生泄漏斩个。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一驯杜、第九天 我趴在偏房一處隱蔽的房頂上張望受啥。 院中可真熱鬧,春花似錦、人聲如沸滚局。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽核畴。三九已至膝但,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谤草,已是汗流浹背跟束。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丑孩,地道東北人冀宴。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像温学,于是被迫代替她去往敵國(guó)和親略贮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 點(diǎn)擊右上角關(guān)注我,為您帶來情感解惑 01 究竟要不要原諒一個(gè)出軌者轧拄,很多人都是左右為難揽祥,進(jìn)退維谷的。原諒是痛檩电,不原...
    林姑娘與波斯貓閱讀 546評(píng)論 0 3
  • 文/老叟 等風(fēng)來 把褶皺的時(shí)間熨平 撫慰這一場(chǎng)雨 夢(mèng)云起 聽梔子花開花落的余音 全在這次等候 活出了最好的年紀(jì) 也...
    編輯鹿深閱讀 326評(píng)論 0 2
  • 在我的家鄉(xiāng)拄丰,日常飲食,不管是三兩小菜俐末,還是豐盛大餐料按,家家戶戶最后端上桌的,必是一道湯卓箫,仿佛有了湯水的滋養(yǎng)载矿,一頓飯才...
    漂齡記閱讀 1,256評(píng)論 8 13