JVM學(xué)習(xí)(7)Stop-The-World

一.概述:

java對象內(nèi)存申請過程:

1.JVM會試圖為相關(guān)Java對象在Eden中初始化一塊內(nèi)存區(qū)域;當(dāng)Eden空間足夠時栖榨,內(nèi)存申請結(jié)束找都。否則到下一步麻掸;
2.JVM試圖釋放在Eden中所有不活躍的對象(minor collection)梭域,釋放后若Eden空間仍然不足以放入新對象斑举,則試圖將部分Eden中活躍對象放入Survivor區(qū);
3.Survivor區(qū)被用來作為Eden及old的中間交換區(qū)域病涨,當(dāng)old區(qū)空間足夠時,Survivor區(qū)的對象會被移到Old區(qū)璧坟,否則會被保留在Survivor區(qū)既穆;
4.當(dāng)old區(qū)空間不夠時赎懦,JVM會在old區(qū)進(jìn)行major collection;
5.垃圾收集后幻工,若Survivor及old區(qū)仍然無法存放從Eden復(fù)制過來的部分對象励两,導(dǎo)致JVM無法在Eden區(qū)為新對象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)"Out of memory錯誤"囊颅;

Stop-The-World:

在新生代進(jìn)行的GC叫做minor GC当悔,在老年代進(jìn)行的GC都叫major GC,F(xiàn)ull GC同時作用于新生代和老年代踢代。在垃圾回收過程中經(jīng)常涉及到對對象的挪動(比如上文提到的對象在Survivor 0和Survivor 1之間的復(fù)制)盲憎,進(jìn)而導(dǎo)致需要對對象引用進(jìn)行更新。為了保證引用更新的正確性胳挎,Java將暫停所有其他的線程饼疙,這種情況被稱為“Stop-The-World”,導(dǎo)致系統(tǒng)全局停頓慕爬。Stop-The-World對系統(tǒng)性能存在影響窑眯,因此垃圾回收的一個原則是盡量減少“Stop-The-World”的時間。

不同垃圾收集器的Stop-The-World情況医窿,Serial磅甩、Parallel和CMS收集器均存在不同程度的Stop-The-Word情況;而即便是最新的G1收集器也不例外姥卢。

  • Java中一種全局暫停的現(xiàn)象,jvm掛起狀態(tài)

  • 全局停頓更胖,所有Java代碼停止,native代碼可以執(zhí)行隔显,但不能和JVM交互

  • 多半由于jvm的GC引起却妨,如:
    1.老年代空間不足。
    2.永生代(jkd7)或者元數(shù)據(jù)空間(jkd8)不足括眠。
    3.System.gc()方法調(diào)用彪标。
    4.CMS GC時出現(xiàn)promotion failed和concurrent mode failure
    5.YoungGC時晉升老年代的內(nèi)存平均值大于老年代剩余空間
    6.有連續(xù)的大對象需要分配

  • 除了GC還有以下原因:
    1.Dump線程--人為因素。
    2.死鎖檢查掷豺。
    3.堆Dump--人為因素捞烟。
    Full GC 是清理整個堆空間—包括年輕代和老年代。

GC時為什么會有全局停頓当船?

類比在聚會時打掃房間题画,聚會時很亂,又有新的垃圾產(chǎn)生德频,房間永遠(yuǎn)打掃不干凈苍息,只有讓大家停止活動了,才能將房間打掃干凈。當(dāng)gc線程在處理垃圾的時候竞思,其它java線程要停止才能徹底清除干凈表谊,否則會影響gc線程的處理效率增加gc線程負(fù)擔(dān),特別是在垃圾標(biāo)記的時候盖喷。

危害

  • 長時間服務(wù)停止爆办,沒有響應(yīng)
  • 遇到HA系統(tǒng),可能引起主備切換课梳,嚴(yán)重危害生產(chǎn)環(huán)境距辆。
  • 新生代的gc時間比較短(),危害小暮刃。
  • 老年代的gc有時候時間短跨算,但是有時候比較長幾秒甚至100秒--幾十分鐘都有。
  • 堆越大花的時間越長沾歪。

三.例子:

  • -Xmn1m代表年輕代幾乎沒有空間漂彤。對象都到老年代了。
  • 類PrintThread是打印線程灾搏,每100毫秒打印一次挫望,如何應(yīng)用線程暫停了,那么會延遲狂窑。
  • 類MyThread是消耗jvm內(nèi)存的線程媳板,每到450M,會讓對象失去引用泉哈。
/**
 *
 * 啟動參數(shù):-Xmx512m -Xms512m -XX:+UseSerialGC -XX:+PrintGCDetails -Xmn1m
 *
 * -XX:+UseSerialGC:新生代和老年代都用單線程的串行回收器蛉幸。適合單核并發(fā)能力差得處理器。
 * -XX:+UseParNewGC:新生代用并行的ParNew回收期丛晦,老年代都用單線程的串行回收器奕纫。適合多核,并發(fā)能力強(qiáng)的處理器烫沙。
 * -XX:+UseParallelGC:新生代使用ParallelGC回收器匹层,老年代使用串行回收器。
   -XX:+UseParallelOldGC:新生代使用ParallelGC回收器锌蓄,老年代使用ParallelOldGC回收器升筏。
 * 1)--
 * -XX:+UseConclMarkSweepGC:老年代使用CMS回收器。
 *
 * Created by chenyang on 20
 * 17/2/2.
 */

public class StopWorldTest {

    public static class MyThread extends Thread{
        HashMap<Long,byte[]> map=new HashMap<Long, byte[]>();

        @Override
        public void run() {
            try {
                while (true){
                    if(map.size()*512/1024/1024>=450){
                        System.out.println("============準(zhǔn)備清理==========:"+map.size());//大于450M時瘸爽,清理內(nèi)存您访。
                        map.clear();
                        System.out.println("clean map");
                    }
                    for(int i=0;i<100;i++){
                        map.put(System.nanoTime(),new byte[512]);//消耗內(nèi)存。
                    }
                    Thread.sleep(1);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    public static class PrintThread extends Thread {

        public static final long starttime = System.currentTimeMillis();

        @Override
        public void run() {
            try {
                while (true) {
                    long t = System.currentTimeMillis() - starttime;
                    System.out.println("time:" + t);
                    Thread.sleep(100);
                }
            } catch (Exception e) {

            }
        }
    }

    public static void main(String[] args) {
        MyThread t=new MyThread();
        PrintThread p=new PrintThread();
        t.start();
        p.start();
    }
}

gc日志:

14.381
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0044628 secs] 511175K->511171K(524224K), 0.0044856 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0048768 secs] 512067K->512064K(524224K), 0.0048978 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0049033 secs] 512960K->512956K(524224K), 0.0049314 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0047410 secs] 513852K->513848K(524224K), 0.0047609 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
14.486
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0058544 secs] 514744K->514740K(524224K), 0.0058874 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 960K->64K(960K), 0.0045730 secs] 515636K->515635K(524224K), 0.0045907 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0053326 secs] 516531K->516527K(524224K), 0.0053546 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0049539 secs] 517423K->517418K(524224K), 0.0049781 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
14.590
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0046786 secs] 518314K->518311K(524224K), 0.0047022 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0041492 secs] 519207K->519204K(524224K), 0.0041714 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0050918 secs] 520100K->520096K(524224K), 0.0051230 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0041798 secs] 520992K->520987K(524224K), 0.0042189 secs] [Times: user=0.00 sys=0.01, real=0.01 secs] 
14.695
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0037032 secs] 521883K->521879K(524224K), 0.0037310 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0052917 secs] 522775K->522774K(524224K), 0.0053151 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 960K->960K(960K), 0.0000131 secs][Tenured: 522710K->523263K(523264K), 0.4556888 secs] 523670K->523666K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4557355 secs] [Times: user=0.45 sys=0.00, real=0.46 secs] 
15.212
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3951695 secs] 524223K->524218K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3951971 secs] [Times: user=0.40 sys=0.00, real=0.39 secs] 
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3942671 secs] 524223K->524222K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3942906 secs] [Times: user=0.39 sys=0.01, real=0.40 secs] 
[Full GC (Allocation Failure) [Tenured: 523263K->516027K(523264K), 0.4641148 secs] 524222K->516027K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4641369 secs] [Times: user=0.46 sys=0.00, real=0.46 secs] 
15.619
[GC (Allocation Failure) [DefNew: 896K->64K(960K), 0.0025171 secs] 516923K->516887K(524224K), 0.0025344 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0042796 secs] 517783K->517781K(524224K), 0.0043039 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0053306 secs] 518677K->518670K(524224K), 0.0053572 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0052464 secs] 519566K->519564K(524224K), 0.0052719 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
16.583
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0050433 secs] 520460K->520444K(524224K), 0.0050696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 960K->64K(960K), 0.0050287 secs] 521340K->521333K(524224K), 0.0050566 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0059352 secs] 522229K->522227K(524224K), 0.0059838 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0051672 secs] 523123K->523111K(524224K), 0.0051959 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
16.687
[GC (Allocation Failure) [DefNew: 959K->959K(960K), 0.0000174 secs][Tenured: 523047K->523263K(523264K), 0.4289996 secs] 524007K->523991K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4290569 secs] [Times: user=0.43 sys=0.00, real=0.43 secs] 
 17.141 
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3752676 secs] 524223K->524219K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3753102 secs] [Times: user=0.37 sys=0.01, real=0.38 secs] 
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3974346 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3974563 secs] [Times: user=0.40 sys=0.00, real=0.39 secs] 
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.4509967 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4510171 secs] [Times: user=0.45 sys=0.00, real=0.46 secs] 
17.522
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3911804 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3912023 secs] [Times: user=0.39 sys=0.00, real=0.39 secs] 
18.762[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.4247627 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4247850 secs] [Times: user=0.42 sys=0.00, real=0.42 secs] 

[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.4053384 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4053664 secs] [Times: user=0.41 sys=0.00, real=0.41 secs] 
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3821490 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3821753 secs] [Times: user=0.38 sys=0.00, real=0.38 secs] 
19.593[Full GC (Allocation Failure) [TenuredException in thread "Thread-0" : 523263K->523263K(523264K), 0.3890329 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3890547 secs] [Times: user=0.39 sys=0.01, real=0.39 secs] 

說明:

  • 17.141秒前都是100ms打印一次剪决,線程沒有停頓灵汪。但是之后發(fā)生了因full gc引發(fā)零點幾秒甚至將近1s的停頓檀训。
  • 因為對象的引用還在,老年代的對象不會被回收识虚。如:
    [Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K),
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肢扯,一起剝皮案震驚了整個濱河市妒茬,隨后出現(xiàn)的幾起案子担锤,更是在濱河造成了極大的恐慌,老刑警劉巖乍钻,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肛循,死亡現(xiàn)場離奇詭異,居然都是意外死亡银择,警方通過查閱死者的電腦和手機(jī)多糠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浩考,“玉大人夹孔,你說我怎么就攤上這事∥瞿酰” “怎么了搭伤?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長袜瞬。 經(jīng)常有香客問我怜俐,道長,這世上最難降的妖魔是什么邓尤? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任拍鲤,我火速辦了婚禮,結(jié)果婚禮上汞扎,老公的妹妹穿的比我還像新娘季稳。我一直安慰自己,他們只是感情好澈魄,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布景鼠。 她就那樣靜靜地躺著,像睡著了一般一忱。 火紅的嫁衣襯著肌膚如雪莲蜘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天帘营,我揣著相機(jī)與錄音票渠,去河邊找鬼。 笑死芬迄,一個胖子當(dāng)著我的面吹牛问顷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杜窄,長吁一口氣:“原來是場噩夢啊……” “哼肠骆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塞耕,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蚀腿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扫外,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莉钙,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年筛谚,在試婚紗的時候發(fā)現(xiàn)自己被綠了磁玉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡驾讲,死狀恐怖蚊伞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吮铭,我是刑警寧澤时迫,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站沐兵,受9級特大地震影響别垮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扎谎,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一碳想、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毁靶,春花似錦胧奔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拐叉,卻和暖如春更啄,著一層夾襖步出監(jiān)牢的瞬間箕昭,已是汗流浹背缠诅。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工拂封, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔬芥。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓梆靖,卻偏偏與公主長得像控汉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子返吻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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

  • JVM架構(gòu) 當(dāng)一個程序啟動之前姑子,它的class會被類裝載器裝入方法區(qū)(Permanent區(qū)),執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,664評論 0 7
  • jvm原理 Java虛擬機(jī)是整個java平臺的基石,是java技術(shù)實現(xiàn)硬件無關(guān)和操作系統(tǒng)無關(guān)的關(guān)鍵環(huán)節(jié)恨课,是java...
    AI喬治閱讀 17,242評論 21 486
  • 原文閱讀 前言 這段時間懈怠了舆乔,罪過岳服! 最近看到有同事也開始用上了微信公眾號寫博客了剂公,挺好的~給他們點贊,這博客我...
    碼農(nóng)戲碼閱讀 5,961評論 2 31
  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory吊宋,是指程序在申請內(nèi)存時纲辽,沒有足夠的內(nèi)存空間供其使用,...
    Aimerwhy閱讀 741評論 0 1
  • 轉(zhuǎn)載blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile閱讀 5,366評論 1 56