<i id="yupd0"></i>
  • <i id="yupd0"></i>
  • <thead id="yupd0"></thead>
    <blockquote id="yupd0"></blockquote>
    <i id="yupd0"></i>
  • 碼迷,www.greeshyz.com
    首頁 > 其他好文 > 詳細

    淺談OOM的應對策略

    時間:2020-07-23 23:27:13      閱讀:84      評論:0      收藏:0      [點我收藏+]

    標簽:shm   jpg   enc   man   自己   lua   queue   自己的   應該   

    堆(heap)是一個巨大的對象池。在這個對象池中管理著數量巨大的對象實例。而池中對象的引用層次,有的是很深的。一個被頻繁調用的接口,每秒生成對象的速度,也是非常可觀的。對象之間的關系,形成了一張巨大的網。雖然 Java 一直在營造一種無限內存的氛圍,但對象不能只增不減,所以需要垃圾回收。
     
    那 JVM 是如何判斷哪些對象應該被回收?哪些應該被保持呢?
     
    在古代,刑罰中有誅九族一說。指的是有些人犯大事時,皇上殺一人不足以平復內心的憤怒時,會對親朋好友產生連帶責任。誅九族時首先需要追溯到一個共同的祖先,再往下細數連坐。堆上的垃圾回收也有同樣的思路。我們接下來就具體分析 JVM 中是如何進行垃圾回收的。JVM 的 GC 動作,是不受程序控制的,它會在滿足條件的時候,自動觸發。在發生 GC 的時候,一個對象,JVM 總能夠找到引用它的祖先。找到最后,如果發現這個祖先已經名存實亡了,它們都會被清理掉。而能夠躲過垃圾回收的那些祖先,比較特殊,它們的名字就叫作 GC Roots。從 GC Roots 向下追溯、搜索,會產生一個叫作 Reference Chain 的鏈條。當一個對象不能和任何一個 GC Root 產生關系時,就會被無情的誅殺掉。
     
    如圖所示,Obj5、Obj6、Obj7,由于不能和 GC Root 產生關聯,發生 GC 時,就會被摧毀。
     
    技術圖片

     

    垃圾回收就是圍繞著 GC Roots 去做的。同時,它也是很多內存泄露的根源,因為其他引用根本沒有這樣的權利。那么,什么樣的對象,才會是 GC Root 呢?這不在于它是什么樣的對象,而在于它所處的位置。
    GC Roots 有哪些?GC Roots 是一組必須活躍的引用。用通俗的話來說,就是程序接下來通過直接引用或者間接引用,能夠訪問到的潛在被使用的對象。

    GC Roots 包括:
    1》Java 線程中,當前所有正在被調用的方法的引用類型參數、局部變量、臨時值等。也就是與我們棧幀相關的各種引用。
    2》所有當前被加載的 Java 類。
    3》Java 類的引用類型靜態變量。
    4》運行時常量池里的引用類型常量(String 或 Class 類型)。
    5》JVM 內部數據結構的一些引用,比如 sun.jvm.hotspot.memory.Universe 類。
    6》用于同步的監控對象,比如調用了對象的 wait() 方法。
    7》JNI handles,包括 global handles 和 local handles。
     
    這些 GC Roots 大體可以分為三大類,下面這種說法更加好記一些:
    • 活動線程相關的各種引用。
    • 類的靜態變量的引用。
    • JNI 引用。

    技術圖片

     

    有兩個注意點:
     
    1》我們這里說的是活躍的引用,而不是對象,對象是不能作為 GC Roots 的。
    2》GC 過程是找出所有活對象,并把其余空間認定為“無用”;而不是找出所有死掉的對象,并回收它們占用的空間。所以,哪怕 JVM 的堆非常的大,基于 tracing 的 GC 方式,回收速度也會非常快。
     
    引用級別
     
    接下來的一道面試題就有意思多了:能夠找到 Reference Chain 的對象,就一定會存活么?在面試的時候,經常會問這些問題,比如“弱引用有什么用處”?令我感到奇怪的是,即使是一些工作多年的 Java 工程師,對待這個問題也是一知半解,錯失了很多機會。對象對于另外一個對象的引用,要看關系牢靠不牢靠,可能在鏈條的其中一環,就斷掉了。

    技術圖片

     

    根據發生 GC 時,這條鏈條的表現,可以對這個引用關系進行更加細致的劃分。它們的關系,可以分為強引用、軟引用、弱引用、虛引用等。

     

    強引用 Strong references
     
    當內存空間不足,系統撐不住了,JVM 就會拋出 OutOfMemoryError 錯誤。即使程序會異常終止,這種對象也不會被回收。這種引用屬于最普通最強硬的一種存在,只有在和 GC Roots 斷絕關系時,才會被消滅掉。這種引用,你每天的編碼都在用。例如:new 一個普通的對象。 
    Object obj = new Object()
    這種方式可能是有問題的。假如你的系統被大量用戶(User)訪問,你需要記錄這個 User 訪問的時間。可惜的是,User 對象里并沒有這個字段,所以我們決定將這些信息額外開辟一個空間進行存放。
    static Map<User,Long> userVisitMap = new HashMap<>();
    ...
    userVisitMap.put(user, time);
    當你用完了 User 對象,其實你是期望它被回收掉的。但是,由于它被 userVisitMap 引用,我們沒有其他手段 remove 掉它。這個時候,就發生了內存泄漏(memory leak)。
    這種情況還通常發生在一個沒有設定上限的 Cache 系統,由于設置了不正確的引用方式,加上不正確的容量,很容易造成 OOM。

     

    軟引用 Soft references
    軟引用用于維護一些可有可無的對象。在內存足夠的時候,軟引用對象不會被回收,只有在內存不足時,系統則會回收軟引用對象,如果回收了軟引用對象之后仍然沒有足夠的內存,才會拋出內存溢出異常。可以看到,這種特性非常適合用在緩存技術上。比如網頁緩存、圖片緩存等。Guava 的 CacheBuilder,就提供了軟引用和弱引用的設置方式。在這種場景中,軟引用比強引用安全的多。軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收,Java 虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。
     
    我們可以看一下它的代碼。軟引用需要顯式的聲明,使用泛型來實現。
    / 偽代碼
    Object object = new Object();
    SoftReference<Object> softRef = new SoftReference(object);
    這里有一個相關的 JVM 參數。它的意思是:每 MB 堆空閑空間中 SoftReference 的存活時間。這個值的默認時間是1秒(1000)。
     
    -XX:SoftRefLRUPolicyMSPerMB=<N>
    這里要特別說明的是,網絡上一些流傳的優化方法,即把這個值設置成 0,其實是錯誤的,這樣容易引發故障,感興趣的話你可以自行搜索一下。這種比較偏門的優化手段,除非在你對其原理相當了解的情況下,才能設置一些比較特殊的值。比如 0 值,無限大等,這種值在 JVM 的設置中,最好不要發生。
     
    弱引用 Weak references
     
    弱引用對象相比較軟引用,要更加無用一些,它擁有更短的生命周期。當 JVM 進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象。弱引用擁有更短的生命周期,在 Java 中,用 java.lang.ref.WeakReference 類來表示。它的應用場景和軟引用類似,可以在一些對內存更加敏感的系統里采用。它的使用方式類似于這段的代碼:
    // 偽代碼
    Object object = new Object();
    WeakReference<Object> softRef = new WeakReference(object);
     
    虛引用 Phantom References
     
    這是一種形同虛設的引用,在現實場景中用的不是很多。虛引用必須和引用隊列(ReferenceQueue)聯合使用。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。實際上,虛引用的 get,總是返回 null。
    Object  object = new Object();
    ReferenceQueue queue = new ReferenceQueue();
    // 虛引用,必須與一個引用隊列關聯
    PhantomReference pr = new PhantomReference(object, queue);
     
    虛引用主要用來跟蹤對象被垃圾回收的活動。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象之前,把這個虛引用加入到與之關聯的引用隊列中。
    程序如果發現某個虛引用已經被加入到引用隊列,那么就可以在所引用的對象的內存被回收之前采取必要的行動。下面的方法,就是一個用于監控 GC 發生的例子。
     
    private static void startMonitoring(ReferenceQueue<MyObject> referenceQueue, Reference<MyObject> ref) {
         ExecutorService ex = Executors.newSingleThreadExecutor();
         ex.execute(() -> {
             while (referenceQueue.poll()!=ref) {
                 //don‘t hang forever
                 if(finishFlag){
                     break;
                }
            }
             System.out.println("-- ref gc‘ed --");
    
        });
         ex.shutdown();
    }
    基于虛引用,有一個更加優雅的實現方式,那就是 Java 9 以后新加入的 Cleaner,用來替代 Object 類的 finalizer 方法。
     
    典型 OOM 場景
     
    OOM 的全稱是 Out Of Memory,那我們的內存區域有哪些會發生 OOM 呢?我們可以從內存區域劃分圖上,看一下彩色部分。
     
     
    技術圖片
    可以看到除了程序計數器,其他區域都有OOM溢出的可能。但是最常見的還是發生在堆上。
    技術圖片
    所以 OOM 到底是什么引起的呢?有幾個原因:
     
    1》內存的容量太小了,需要擴容,或者需要調整堆的空間。
    2》錯誤的引用方式,發生了內存泄漏。沒有及時的切斷與 GC Roots 的關系。比如線程池里的線程,在復用的情況下忘記清理 ThreadLocal 的內容。
    3》接口沒有進行范圍校驗,外部傳參超出范圍。比如數據庫查詢時的每頁條數等。
    4》對堆外內存無限制的使用。這種情況一旦發生更加嚴重,會造成操作系統內存耗盡。
     
    典型的內存泄漏場景,原因在于對象沒有及時的釋放自己的引用。比如一個局部變量,被外部的靜態集合引用。
    技術圖片
    平常寫代碼時,一定要注意這種情況,千萬不要為了方便把對象到處引用。即使引用了,也要在合適時機進行手動清理。

    淺談OOM的應對策略

    標簽:shm   jpg   enc   man   自己   lua   queue   自己的   應該   

    原文地址:https://www.cnblogs.com/limingblogs/p/13368574.html

    (0)
    (0)
       
    舉報
    評論 一句話評論(0
    登錄后才能評論!
    迷上了代碼!
    91色国产论坛,久草99福利资源,青青草在线华人,99热在线视频观看免费,青青草a片免费看,青青草av视频导航,香蕉网站伊人大香蕉 青青碰人青青草免费 国产自拍偷拍在线播放 青青草华人在线av 伊人影院在线大香 无码大香蕉网伊人色 久久大香蕉视频网 青草精品资源在线 伊人大香蕉在线精品 97资源总站久久爱视频 自拍中文字幕 青青草手机在线视频 青青草久久爱大香蕉 国产青青草自拍 伊人大香蕉在线精品 97资源总站久久爱视频 自拍中文字幕 av图片在线看 久草视频福利免费资源站 自拍国产视频在线 www.琪琪色 爱色影爱色搞搞 97资源库 大香萑a久草视频 久草在线福利资站 青青草成人在线免费视频 久久精品国can视频在热 99热国产情侣偷拍 国产自拍 在线 凹凸分类视频97免费 av啪啪中文网站 青青草91自拍视频 奇米影视第四色 国产无限制自拍 大香蕉伊人精品在线 久久手机看片国产免费 无码大香蕉网伊人色 亚洲激情色 久草99福利资源 狼人色终合网站 91色国产色去色 2019奇米777奇米网 久久草妹妹色 米奇影院888奇米色 青青青草成人免费现看 超碰自拍 在线99热这里精品 色琪琪永久无码 伊人大香蕉成人视频综合 国产自拍视频在线 大香蕉伊人久操在线 青青草久草热久久草 偷拍自拍第四色 奇米网电影网 超碰99久久天天拍日日操 天天拍天天拍久草片 激情图片,激情小说 超碰碰av大香蕉伊人 久草97大香蕉伊人 美女伊人色情香蕉网站 青青草华人免费视频在线 大香蕉伊人久草视频 奇米网在线手机在线 青草七次郞视频观看 青青草公开在线观看 狠狠夜夜干大香蕉伊人 777奇米网 日逼视频网站 欧美人和动物XXX 大香蕉色 欧美 国产 奇米影院首页 大香蕉伊人久久爱在线 青青青草免费手机播放 国产青青草 欧美一级黑寡妇夜夜干 啪啪 国产精品 东方aⅴ在线看 手机看A片 777米奇色狠狠俺去啦 香蕉网站伊人中文字幕 久操在线新免费视频 伊人影院在线大香 大香蕉成人伊人在线视频 青青草成人在线视频观看 91国产自拍偷拍视频 青青草色爱久久 精品国产自拍 小色狗 琪琪热热色无码 影音先锋大香蕉久草资源 小明视频看看成人免费 俺去了色网婷婷色 久久色情片 超碰在线青青草 超碰视频起碰视频 国产偷拍自拍影音先锋 小明视频看看成人免费 俺去了色网婷婷色 久久色情片 超碰在线青青草 超碰视频起碰视频 国产偷拍自拍影音先锋 老鸭窝在线视频 www.奇米在线四色 老版本日本怡春院 强奸乱伦在线观看 青青草在观视频 色琪琪在线视频原网 欧美色色大香焦 欧美色热图 亚洲香蕉手机在线观看视频 偷拍偷窥自拍网站 超91在线观看 最新奇米奇色777在线 婷婷网站 微拍秒拍福利视频 自拍在线 精品视频 欧美情色无码在线 久草激情视频 午夜高清影院在线观看 第四色青娱乐奇米影视 青青草在线综合 99热这里有精品 自拍偷拍影音先锋 国产自拍 先锋影音 成人在线视频97 久草在线免费观看大香蕉 99er久久国产精品在线 精品国产在线偷拍 啪啪青青草视频 国内偷拍 亚洲 大香蕉成人手机在线 在线伊人大香蕉手机版 久草伊人久草视频 伊人久久青青草综合网 青青草手机在线视频 青青草久久爱大香蕉 国产青青草自拍 伊人大香蕉在线精品 97资源总站久久爱视频 自拍中文字幕 av图片在线看 久草视频福利免费资源站 自拍国产视频在线 www.琪琪色 爱色影爱色搞搞 97资源库 大香蕉在线视频免费观看 a片直播妹子在线视频 a.v在线视频 开心五月色婷婷免费 香蕉福利视频在线观 青青草成人+激情偷拍 青青草视频大香蕉伊人网 av啪啪中文网站 青青草91自拍视频 奇米影视第四色 国产无限制自拍 大香蕉伊人精品在线 久久手机看片国产免费 无码大香蕉网伊人色 亚洲激情色 久草99福利资源 狼人色终合网站 91色国产色去色 2019奇米777奇米网 久久草妹妹色 米奇影院888奇米色 青青青草成人免费现看 超碰自拍 在线99热这里精品 色琪琪永久无码 伊人大香蕉成人视频综合 国产自拍视频在线 大香蕉伊人久操在线 青青草久草热久久草 偷拍自拍第四色 奇米网电影网 超碰99久久天天拍日日操 天天拍天天拍久草片 激情图片,激情小说 青青草久草热久久草 偷拍自拍第四色 奇米网电影网 超碰99久久天天拍日日操 天天拍天天拍久草片 操好屌色 米奇先锋 久草 偷拍 亚洲,偷拍,自拍,精品 伊人大香蕉综合色 大香蕉久久久 成人色啪啪 大香蕉色看片 欧美自拍在线 久久色综合网站xoxo 久热草大香蕉在线视频 久久大香蕉视频网 肏逼免费视频在线 网友自拍偷拍 欧美 国产 奇米影院首页 大香蕉伊人久久爱在线 青青青草免费手机播放 国产青青草 欧美一级黑寡妇夜夜干 啪啪 国产精品 东方aⅴ在线看 手机看A片 777米奇色狠狠俺去啦 香蕉网站伊人中文字幕 久操在线新免费视频 伊人影院在线大香 大香蕉成人伊人在线视频 青青草成人在线视频观看 91国产自拍偷拍视频 青青草色爱久久 精品国产自拍 小色狗 琪琪热热色无码 影音先锋大香蕉久草资源 小明视频看看成人免费 俺去了色网婷婷色 久久色情片 超碰在线青青草 欧美激情图片 自拍超碰 久草视频在线 天天 综合色伊人网 大香蕉视频成人中文网 大香蕉伊人欧美色 久热在线播放中文字幕 青青草久草福利 欧美色色大香焦 欧美色热图 亚洲香蕉手机在线观看视频 偷拍偷窥自拍网站 超91在线观看 最新奇米奇色777在线 婷婷网站 微拍秒拍福利视频 自拍在线 精品视频 欧美情色无码在线 久草激情视频 午夜高清影院在线观看 第四色青娱乐奇米影视 青青草在线综合 99热这里有精品 自拍偷拍影音先锋 国产自拍 先锋影音 成人在线视频97 久草在线免费观看大香蕉 99er久久国产精品在线
    久久草2019在线观看 99这里有精品 大香蕉免费公开青青草 狠狠色丁香婷婷综合 国产久草福利手机在线 青青草黄色三级网站 大香蕉他也啪 青青草视频大香蕉伊人网 久久爱大香焦在线视频 日本有码视频 成人视屏 国产精品91在线 91国产自拍小视频 伊人狼人香蕉网小说 青青草香蕉草久在线 av青青操 亚洲自拍欧美 91 国产 在线 97超碰资源共享 青青草伊人大香蕉 奇米四色网 国産偷拍91 精品国产在线自拍 伊人大香蕉色琪琪影院 caoprom超碰 青青视频在线视频 开心五月婷婷色婷在线 第四色色 Caoprom超碰视频 亚洲图片欧美图色姐 天天干情色网 操妹妹干妹妹 丁香五月婷婷伊人大香蕉 国产精品自拍偷拍在线 青青青成人社区 成人av在线 碰碰视频在线免费播放 影音先锋 小说色 久久草大香蕉 亚洲情色狼人网 思思久久re热线播放 久久草超碰 播播影院私人影院 大香蕉他也啪 米奇影视 成人国产老鸭窝 伊人大香蕉久久天天啪 男人的天堂 国产精品自偷拍 很很鲁在线97