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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    緩存的分代

    Posted on 2010-06-05 10:13 dennis 閱讀(4517) 評論(5)  編輯  收藏 所屬分類: java數據庫技術涂鴉數據結構與算法
        Java的垃圾收集算法是分代的,因為根據2/8原則,80%的Java對象都是速生速滅的,因此將Java Heap劃分為new和old,對兩個區域采用不同的垃圾回收算法,在new代存活下來的對象轉移到old區,這樣一來大大提高了Java GC的效率。
        類似分代的思想在很多地方可以用到,分代的本質是根據對象生命周期的不同做區別處理,而不是采取一刀切的方式來提高系統的處理效率。推而廣之,比如緩存的使用,現在很多web應用都采用了類似memcached這樣的緩存擋在數據庫前面分擔負載,那么你可以將memcached理解成new代,而數據庫是old代。memcached中存儲的是查詢的熱點數據,新鮮火熱,但是易失,并且在數據更新的時候被移除;而數據庫保存了所有的數據,當緩存沒有命中的時候才去查詢數據庫并存儲到緩存。new和old這只是簡單的二代劃分,事實上現在越來越多的系統是多級緩存,頁面緩存、memcached緩存、JVM內部緩存、查詢緩存等等直到數據庫,從web頁面到后端是一個越來越old的過程,緩存對象持續的生命周期逐漸增長直到persist狀態。
        具體到JVM內部緩存,我們通常使用LRU算法來實現一個安全有限的緩存,如直接繼承LinkedHashMap將可以實現一個簡單的LRUMap。基于內存使用上的考慮,我們會給LRUMap設定一個最大的capacity,當數據量超過這個capacity的時候將最近最少訪問的元素移除來容納新的元素。這樣處理產生的問題是這個capactity不能設置得太大,因為怕內存不夠用,但是不夠大的結果可能是命中率沒有那么高(跟你的場景相關),那么如何在保存內存安全的前提下更進一步緩存更多的對象呢?答案也是分代。LRUMap默認存儲的都是對象的強引用,我們知道Java還有其他3種引用類:soft,weak和phantom。其中Soft引用是在jvm內存不夠的時候進行回收,weak引用是在垃圾回收碰到的時候會被回收,顯然weak->soft->strong三類引用的生命周期可以劃分為3個代,我們將可以實現一個可以容納更多對象的LRUMap:LRUMap設置兩個閥值,一個是強引用的最大閥值,這個不能太大,一個是軟引用的最大數目,當超過第一個閥值的時候,不是將LRU替換出來的對象移除,而是替代轉換為軟引用存儲;如果軟引用的數目也超過閥值,那么可以將軟引用這個Map里的對象LRU替換成Weak引用存儲或者簡單移除。處理元素查詢的時候,多了一個步驟,在查詢強引用未果的情況下,需要再去查詢軟引用集合,不過都是O(1)復雜度的查詢,不會成為明顯的瓶頸。通過將緩存對象分代,我們實現了容難更多緩存對象的目標,大部分對象以強引用的形式存儲,被LRU替換出去最近最少訪問的元素以軟引用存儲,它們在內存不夠的時候被垃圾回收,保證了內存使用上的安全性。我們在系統中采用了類似這樣的緩存,緩存的命中率有了明顯的提高。
        題目是《緩存的分代》,其實談的是分代這種常見的設計或者說技巧,在需要處理大量對象的場景中,不采用一刀切的方式,而是根據對象的特點進行適當的分代處理,帶來的效率提升可能是驚人的。

        PS.關于這個招聘羅嗦兩句,我是這個小組的成員,有人質疑我的目的是為了賺推薦費,這個不能說沒有,不過主要目的還是招人,我們很缺人。那么多要求可以歸結為一句話:我們找Java基礎良好、對并發通信有豐富實踐經驗、寫代碼相對靠譜、為人相對靠譜的人。那些要求并非硬性,如果你覺的合適,盡管投簡歷,謝謝。我們小組做的東西我認為還是有價值的,也很有挑戰,淘寶內部的很多應用都在使用,如果你希望你做的產品被成千上萬的人每天使用,歡迎加入。

         

       


    評論

    # re: 緩存的分代  回復  更多評論   

    2010-06-05 14:16 by cd
    有個字寫錯了,閾值,不是閥值~~~

    # re: 緩存的分代  回復  更多評論   

    2010-06-05 14:16 by jaedong
    好文,頂.... 啥時候,在寫些NIO方面的東東啊...包括你地框架

    # re: 緩存的分代  回復  更多評論   

    2010-06-05 22:26 by yeshucheng
    @cd
    樓主沒有寫錯啊,是閥門的“閥”。或許在某些地方有翻譯不同,但是這個閥值個人覺得更確切。引申下:閥門在某個臨界位置就需要釋放某個數值

    曉丹繼續寫啊,再深入下。結合畢玄寫的那本書,有個更好的碰撞火花,哈哈。
    我讀書少,你寫的通俗易懂!贊!

    # re: 緩存的分代  回復  更多評論   

    2010-06-06 18:31 by 追夢少年
    很好!!!

    # re: 緩存的分代[未登錄]  回復  更多評論   

    2010-06-19 22:23 by 牛牛
    嗯,看了后,很大收獲
    主站蜘蛛池模板: 国产免费啪嗒啪嗒视频看看| 日韩毛片无码永久免费看| 中文字幕亚洲专区| 国产精品免费久久久久影院| 亚洲片国产一区一级在线观看| 一级毛片在播放免费| 亚洲小说区图片区另类春色| a级毛片视频免费观看| 色婷婷亚洲十月十月色天| 一级女人18毛片免费| 亚洲精品无AMM毛片| 国产伦精品一区二区三区免费迷| 美女羞羞视频免费网站| 中文字幕亚洲天堂| 24小时日本电影免费看| 亚洲日本久久一区二区va| 日本免费人成视频播放| 国产精品玖玖美女张开腿让男人桶爽免费看| 亚洲综合精品网站| 久别的草原电视剧免费观看| 亚洲无人区视频大全| 国产在线播放免费| a级片免费在线播放| 激情亚洲一区国产精品| 日韩一区二区三区免费体验| 视频免费1区二区三区| 亚洲AV人人澡人人爽人人夜夜| 国产成人免费网站| 一级毛片成人免费看a| 亚洲va在线va天堂va不卡下载| 国产va精品免费观看| 成人a毛片免费视频观看| 久久久久亚洲AV无码专区首| 免费观看男人免费桶女人视频 | 国产在线ts人妖免费视频| 久久国产一片免费观看| 亚洲第一精品电影网| 全部免费国产潢色一级| 99在线观看视频免费| 无遮挡呻吟娇喘视频免费播放| 亚洲AV无码成人精品区天堂 |