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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理
        Java的垃圾收集算法是分代的,因?yàn)楦鶕?jù)2/8原則,80%的Java對象都是速生速滅的,因此將Java Heap劃分為new和old,對兩個(gè)區(qū)域采用不同的垃圾回收算法,在new代存活下來的對象轉(zhuǎn)移到old區(qū),這樣一來大大提高了Java GC的效率。
        類似分代的思想在很多地方可以用到,分代的本質(zhì)是根據(jù)對象生命周期的不同做區(qū)別處理,而不是采取一刀切的方式來提高系統(tǒng)的處理效率。推而廣之,比如緩存的使用,現(xiàn)在很多web應(yīng)用都采用了類似memcached這樣的緩存擋在數(shù)據(jù)庫前面分擔(dān)負(fù)載,那么你可以將memcached理解成new代,而數(shù)據(jù)庫是old代。memcached中存儲的是查詢的熱點(diǎn)數(shù)據(jù),新鮮火熱,但是易失,并且在數(shù)據(jù)更新的時(shí)候被移除;而數(shù)據(jù)庫保存了所有的數(shù)據(jù),當(dāng)緩存沒有命中的時(shí)候才去查詢數(shù)據(jù)庫并存儲到緩存。new和old這只是簡單的二代劃分,事實(shí)上現(xiàn)在越來越多的系統(tǒng)是多級緩存,頁面緩存、memcached緩存、JVM內(nèi)部緩存、查詢緩存等等直到數(shù)據(jù)庫,從web頁面到后端是一個(gè)越來越old的過程,緩存對象持續(xù)的生命周期逐漸增長直到persist狀態(tài)。
        具體到JVM內(nèi)部緩存,我們通常使用LRU算法來實(shí)現(xiàn)一個(gè)安全有限的緩存,如直接繼承LinkedHashMap將可以實(shí)現(xiàn)一個(gè)簡單的LRUMap。基于內(nèi)存使用上的考慮,我們會給LRUMap設(shè)定一個(gè)最大的capacity,當(dāng)數(shù)據(jù)量超過這個(gè)capacity的時(shí)候?qū)⒆罱钌僭L問的元素移除來容納新的元素。這樣處理產(chǎn)生的問題是這個(gè)capactity不能設(shè)置得太大,因?yàn)榕聝?nèi)存不夠用,但是不夠大的結(jié)果可能是命中率沒有那么高(跟你的場景相關(guān)),那么如何在保存內(nèi)存安全的前提下更進(jìn)一步緩存更多的對象呢?答案也是分代。LRUMap默認(rèn)存儲的都是對象的強(qiáng)引用,我們知道Java還有其他3種引用類:soft,weak和phantom。其中Soft引用是在jvm內(nèi)存不夠的時(shí)候進(jìn)行回收,weak引用是在垃圾回收碰到的時(shí)候會被回收,顯然weak->soft->strong三類引用的生命周期可以劃分為3個(gè)代,我們將可以實(shí)現(xiàn)一個(gè)可以容納更多對象的LRUMap:LRUMap設(shè)置兩個(gè)閥值,一個(gè)是強(qiáng)引用的最大閥值,這個(gè)不能太大,一個(gè)是軟引用的最大數(shù)目,當(dāng)超過第一個(gè)閥值的時(shí)候,不是將LRU替換出來的對象移除,而是替代轉(zhuǎn)換為軟引用存儲;如果軟引用的數(shù)目也超過閥值,那么可以將軟引用這個(gè)Map里的對象LRU替換成Weak引用存儲或者簡單移除。處理元素查詢的時(shí)候,多了一個(gè)步驟,在查詢強(qiáng)引用未果的情況下,需要再去查詢軟引用集合,不過都是O(1)復(fù)雜度的查詢,不會成為明顯的瓶頸。通過將緩存對象分代,我們實(shí)現(xiàn)了容難更多緩存對象的目標(biāo),大部分對象以強(qiáng)引用的形式存儲,被LRU替換出去最近最少訪問的元素以軟引用存儲,它們在內(nèi)存不夠的時(shí)候被垃圾回收,保證了內(nèi)存使用上的安全性。我們在系統(tǒng)中采用了類似這樣的緩存,緩存的命中率有了明顯的提高。
        題目是《緩存的分代》,其實(shí)談的是分代這種常見的設(shè)計(jì)或者說技巧,在需要處理大量對象的場景中,不采用一刀切的方式,而是根據(jù)對象的特點(diǎn)進(jìn)行適當(dāng)?shù)姆执幚恚瑤淼男侍嵘赡苁求@人的。

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

         

       


    評論

    # re: 緩存的分代  回復(fù)  更多評論   

    2010-06-05 14:16 by cd
    有個(gè)字寫錯(cuò)了,閾值,不是閥值~~~

    # re: 緩存的分代  回復(fù)  更多評論   

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

    # re: 緩存的分代  回復(fù)  更多評論   

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

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

    # re: 緩存的分代  回復(fù)  更多評論   

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

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

    2010-06-19 22:23 by 牛牛
    嗯,看了后,很大收獲
    主站蜘蛛池模板: 国产gav成人免费播放视频| 成年女人免费v片| 99热在线精品免费全部my| 亚洲第一成年免费网站| 日韩在线视频免费看| 亚洲人成网站在线观看青青| 亚洲va无码专区国产乱码| 亚洲福利电影在线观看| 亚洲av永久中文无码精品综合| 午夜成人无码福利免费视频| 日本黄色动图免费在线观看| 97视频免费在线| 四虎亚洲国产成人久久精品| 亚洲AV无码一区东京热久久| 国产成人亚洲合集青青草原精品| 黄色免费网址大全| 午夜精品免费在线观看| 女人被男人躁的女爽免费视频| 久久久久亚洲AV无码专区网站| 亚洲日本香蕉视频观看视频| 国产亚洲精品第一综合| 成全高清在线观看免费| 18禁成年无码免费网站无遮挡| 亚洲人成无码网站久久99热国产| 亚洲色图在线观看| 蜜臀亚洲AV无码精品国产午夜.| 日韩电影免费在线观看网站| 成人毛片18女人毛片免费| 久久综合亚洲色HEZYO国产| 亚洲乱码卡一卡二卡三| 免费人成大片在线观看播放| 久久久久久毛片免费播放| 四虎永久成人免费影院域名| 亚洲图片在线观看| 黄色毛片视频免费| 99久久99这里只有免费费精品 | 国产免费一区二区三区| 日韩精品亚洲专区在线观看| 亚洲性一级理论片在线观看| www成人免费视频| 免费看无码自慰一区二区|