什么是堆外內(nèi)存群扶?堆內(nèi)內(nèi)存還是堆外內(nèi)存及刻?

轉(zhuǎn)自: Imcache :一個(gè)Java新的緩存框架
堆Heap是內(nèi)存中動(dòng)態(tài)分配對象居住的地方镀裤。
如果使用new一個(gè)對象,它就被分配在堆內(nèi)存上缴饭。
這是相對于Stack暑劝,如果你有一個(gè)局部變量則它是位于Stack棧內(nèi)存空間。
BigMemory是用來避免GC對堆的開銷颗搂,從幾MB或GB大担猛。
BigMemory通過直接的ByteBuffers使用JVM進(jìn)程的內(nèi)存地址空間,不像其他原生Java對象接受GC管束丢氢。

EHCache(Terrcotta BigMemory)的 off-heap將你的對象從堆中脫離出來序列化毁习,然后存儲(chǔ)在一大塊內(nèi)存中,這就像它存儲(chǔ)到磁盤上上一樣卖丸,但它仍然在RAM中。

對象在這種狀態(tài)下不能直接使用盏道,它們必須首先反序列化稍浆。
也不受垃圾收集。序列化和反序列化會(huì)影響性能猜嘱。(FST-serialization還是很快)衅枫。
使用堆外內(nèi)存能夠降低GC導(dǎo)致的暫停。

應(yīng)用場景:

  1. Session會(huì)話緩存朗伶,保存不激活的用戶session弦撩,比如用戶沒有正常退出,我們也無法確定他會(huì)不會(huì)短時(shí)間內(nèi)再回來论皆,將其會(huì)話存到堆外內(nèi)存益楼。一旦再次登錄,無需訪問數(shù)據(jù)庫可再次激活点晴。

  2. 計(jì)算結(jié)果的緩存感凤,大量查詢的結(jié)果等,擊中率比較低的都可以遷移到堆外粒督。

原文地址:http://www.infoq.com/cn/news/2014/12/external-memory-heap-memory/

一般情況下陪竿,Java中分配的非空對象都是由Java虛擬機(jī)的垃圾收集器管理的,也稱為堆內(nèi)內(nèi)存(on-heap memory)屠橄。
虛擬機(jī)會(huì)定期對垃圾內(nèi)存進(jìn)行回收族跛,在某些特定的時(shí)間點(diǎn),它會(huì)進(jìn)行一次徹底的回收(full gc)锐墙。
徹底回收時(shí)礁哄,垃圾收集器會(huì)對所有分配的堆內(nèi)內(nèi)存進(jìn)行完整的掃描,這意味著一個(gè)重要的事實(shí)——這樣一次垃圾收集對Java應(yīng)用造成的影響贮匕,跟堆的大小是成正比的姐仅。
過大的堆會(huì)影響Java應(yīng)用的性能。

對于這個(gè)問題,一種解決方案就是使用堆外內(nèi)存(off-heap memory)掏膏。
堆外內(nèi)存意味著把內(nèi)存對象分配在Java虛擬機(jī)的堆以外的內(nèi)存劳翰,這些內(nèi)存直接受操作系統(tǒng)管理(而不是虛擬機(jī))。
這樣做的結(jié)果就是能保持一個(gè)較小的堆馒疹,以減少垃圾收集對應(yīng)用的影響佳簸。

但是Java本身也在不斷對堆內(nèi)內(nèi)存的實(shí)現(xiàn)方式做改進(jìn)。
兩者各有什么優(yōu)缺點(diǎn)颖变?Vanilla Java博客作者Peter Lawrey撰寫了一篇文章生均,在文中他對三種方式:
用new來分配對象
對象池(object pool)
堆外內(nèi)存,
進(jìn)行了詳細(xì)的分析腥刹。
用new來分配對象內(nèi)存是最基本的一種方式马胧,Lawery提到:

在Java 5.0之前,分配對象的代價(jià)很大衔峰,以至于大家都使用內(nèi)存池佩脊。但是從5.0開始,對象分配和垃圾回收變得快多了垫卤,研發(fā)人員發(fā)現(xiàn)了性能的提升威彰,紛紛簡化他們的代碼,不再使用內(nèi)存池穴肘,而直接用new來分配對象歇盼。從5.0開始,只有一些分配代價(jià)較大的對象评抚,比如線程豹缀、套接字和數(shù)據(jù)庫鏈接,用內(nèi)存池才會(huì)有明顯的性能提升盈咳。

對于內(nèi)存池耿眉,Lawery認(rèn)為它主要用于兩類對象。
第一類是生命周期較短鱼响,且結(jié)構(gòu)簡單的對象鸣剪,在內(nèi)存池中重復(fù)利用這些對象能增加CPU緩存的命中率,從而提高性能丈积。
第二種情況是加載含有大量重復(fù)對象的大片數(shù)據(jù)筐骇,此時(shí)使用內(nèi)存池能減少垃圾回收的時(shí)間。對此江滨,Lawery還以StringInterner為例進(jìn)行了說明铛纬。
最后Lawery分析了堆外內(nèi)存,它和內(nèi)存池一樣唬滑,也能縮短垃圾回收時(shí)間告唆,但是它適用的對象和內(nèi)存池完全相反棺弊。內(nèi)存池往往適用于生命期較短的可變對象,而生命期中等或較長的對象擒悬,正是堆外內(nèi)存要解決的模她。

堆外內(nèi)存有以下特點(diǎn):

  • 對于大內(nèi)存有良好的伸縮性
  • 對垃圾回收停頓的改善可以明顯感覺到
  • 在進(jìn)程間可以共享,減少虛擬機(jī)間的復(fù)制

Lawery還提到對外內(nèi)存最重要的還不是它能改進(jìn)性能懂牧,而是它的確定性侈净。
當(dāng)然堆外內(nèi)存也有它自己的問題,最大的問題就是你的數(shù)據(jù)結(jié)構(gòu)變得不那么直觀僧凤,如果數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜畜侦,就要對它進(jìn)行串行化(serialization),而串行化本身也會(huì)影響性能躯保。
另一個(gè)問題是由于你可以使用更大的內(nèi)存旋膳,你可能開始擔(dān)心虛擬內(nèi)存(即硬盤)的速度對你的影響了。

Lawery還介紹了OpenHFT公司提供三個(gè)開源庫:
Chronicle Queue途事、
Chronicle Map
Thread Affinity
這些庫可以幫助開發(fā)人員使用堆外內(nèi)存來保存數(shù)據(jù)溺忧。采用堆外內(nèi)存有很多好處,同時(shí)也帶來挑戰(zhàn)盯孙,

對堆外內(nèi)存感興趣的讀者可以閱讀Lawery的原文來了解更多信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祟滴,一起剝皮案震驚了整個(gè)濱河市振惰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垄懂,老刑警劉巖骑晶,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異草慧,居然都是意外死亡桶蛔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門漫谷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仔雷,“玉大人,你說我怎么就攤上這事舔示〉牛” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵惕稻,是天一觀的道長竖共。 經(jīng)常有香客問我,道長俺祠,這世上最難降的妖魔是什么公给? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任借帘,我火速辦了婚禮,結(jié)果婚禮上淌铐,老公的妹妹穿的比我還像新娘肺然。我一直安慰自己,他們只是感情好匣沼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布狰挡。 她就那樣靜靜地躺著,像睡著了一般释涛。 火紅的嫁衣襯著肌膚如雪加叁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天唇撬,我揣著相機(jī)與錄音它匕,去河邊找鬼。 笑死窖认,一個(gè)胖子當(dāng)著我的面吹牛豫柬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扑浸,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼烧给,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喝噪?” 一聲冷哼從身側(cè)響起础嫡,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酝惧,沒想到半個(gè)月后榴鼎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晚唇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年巫财,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩陕。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡平项,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悍及,到底是詐尸還是另有隱情葵礼,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布并鸵,位于F島的核電站鸳粉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏园担。R本人自食惡果不足惜届谈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一枯夜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艰山,春花似錦湖雹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纵装,卻和暖如春征讲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背橡娄。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工诗箍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挽唉。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓滤祖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓶籽。 傳聞我的和親對象是個(gè)殘疾皇子匠童,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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

  • 本文由作者自行翻譯,未經(jīng)作者授權(quán)塑顺,不得隨意轉(zhuǎn)發(fā)俏让。后續(xù)作者會(huì)陸續(xù)發(fā)布一系列關(guān)于JVM內(nèi)存管理的文章,敬請期待茬暇。 1、...
    猿學(xué)堂閱讀 1,344評論 0 50
  • 堆外內(nèi)存 堆外內(nèi)存是相對于堆內(nèi)內(nèi)存的一個(gè)概念寡喝。堆內(nèi)內(nèi)存是由JVM所管控的Java進(jìn)程內(nèi)存糙俗,我們平時(shí)在Java中創(chuàng)建...
    tomas家的小撥浪鼓閱讀 40,420評論 19 71
  • 堆外內(nèi)存 堆外內(nèi)存是相對于堆內(nèi)內(nèi)存的一個(gè)概念。堆內(nèi)內(nèi)存是由JVM所管控的Java進(jìn)程內(nèi)存预鬓,我們平時(shí)在Java中創(chuàng)建...
    科大醉俠閱讀 595評論 0 1
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理巧骚,因此不免有一些不準(zhǔn)確的地方,同時(shí)不同JDK版本的...
    高廣超閱讀 15,545評論 3 83
  • 第一章 簡介 J2SE平臺的一大優(yōu)勢是它的自動(dòng)化內(nèi)存管理格二,避免了開發(fā)者去面對內(nèi)存管理的復(fù)雜性劈彪。 本文以Sun J2...
    tianyiliusha閱讀 945評論 0 1