JAVA堆外緩存

1 背景

假如有一個(gè)服務(wù)的各項(xiàng) JVM 的配置都比較合理的情況下颤专,它的 GC 情況還是不容樂(lè)觀募逞。

然后 dump 了一把內(nèi)存弓摘,一頓分析之后發(fā)現(xiàn)有 2 個(gè)對(duì)象特別巨大娜膘,占了總存活堆內(nèi)存的 76.8%。

其中第 1 大對(duì)象是本地緩存级乍, 使用 caffine 緩存組件舌劳,緩存自動(dòng)刷新周期設(shè)定 1 小時(shí),目的是盡量減少 IO 查詢(xún)次數(shù)玫荣;

由于占用空間很大甚淡,會(huì)導(dǎo)致頻繁GC,影響系統(tǒng)性能捅厂。

如何能盡量緩存較多的數(shù)據(jù)贯卦,同時(shí)避免過(guò)大的 GC 壓力呢底挫?

可以把緩存對(duì)象移到堆外,這樣可以不受堆內(nèi)內(nèi)存大小的限制脸侥;并且堆外內(nèi)存建邓,并不受 JVM GC 的管控,避免了緩存過(guò)大對(duì) GC 的影響睁枕。

堆外內(nèi)存不受堆內(nèi)內(nèi)存大小的限制官边,只受服務(wù)器物理內(nèi)存的大小限制。這三者之間的關(guān)系是這樣的:物理內(nèi)存=堆外內(nèi)存+堆內(nèi)內(nèi)存外遇。

2 堆外緩存

為了緩解在高并發(fā)注簿,高寫(xiě)入操作下,堆內(nèi)緩存組件造成的頻繁GC問(wèn)題跳仿,堆外緩存應(yīng)運(yùn)而生诡渴。堆內(nèi)緩存是受JVM管控的,所以我們不必?fù)?dān)心垃圾回收的問(wèn)題菲语。但是堆外緩存是不受JVM管控的妄辩,所以也不受GC的影響導(dǎo)致的應(yīng)用暫停問(wèn)題。但是由于堆外緩存的使用山上,是以byte數(shù)組來(lái)進(jìn)行的眼耀,所以需要自己進(jìn)行序列化反序列化操作。目前已知的知名開(kāi)源項(xiàng)目中佩憾,netty4的buffer pool采用了堆外緩存實(shí)現(xiàn)哮伟,具體的比對(duì)信息截圖如下:

img

帶有Direct字眼的即為offheap堆外Buffer,x軸為分配的內(nèi)存大小妄帘,Y軸為耗時(shí)楞黄。從上面可以看出,小塊內(nèi)存分配抡驼,JVM要稍微優(yōu)秀一點(diǎn)鬼廓;但是大塊內(nèi)存分配,明顯的堆外緩存要優(yōu)秀一些婶恼。由于堆外Buffer操作不受GC影響桑阶,實(shí)際上性能更好一些。但是需要的垃圾回收管控也需要自己去做勾邦,要麻煩很多。

2 開(kāi)源堆外緩存組件 OHC

2.1 OHC 介紹

OHC 全稱(chēng)為 off-heap-cache割择,即堆外緩存眷篇,是 2015 年針對(duì) Apache Cassandra 開(kāi)發(fā)的緩存框架,后來(lái)從 Cassandra 項(xiàng)目中獨(dú)立出來(lái)荔泳,成為單獨(dú)的類(lèi)庫(kù)蕉饼,其項(xiàng)目地址為:https://github.com/snazy/ohc

其特性如下:

  • 數(shù)據(jù)存儲(chǔ)在堆外虐杯,只有少量元數(shù)據(jù)存儲(chǔ)堆內(nèi),不影響 GC

  • 支持為每個(gè)緩存項(xiàng)設(shè)置過(guò)期時(shí)間

  • 支持配置 LRU昧港、W_TinyLFU 驅(qū)逐策略

  • 能夠維護(hù)大量的緩存條目

  • 支持異步加載緩存

  • 讀寫(xiě)速度在微秒級(jí)別

OHC具有低延遲擎椰、容量大、不影響GC的特性创肥,并且支持使用方根據(jù)自身業(yè)務(wù)需求進(jìn)行靈活配置达舒。

2.2 OHC 用法

快速開(kāi)始:

OHCache ohCache = OHCacheBuilder.newBuilder().
 keySerializer(yourKeySerializer)
 .valueSerializer(yourValueSerializer)
 .build();

可選配置項(xiàng):

圖片

在我們的服務(wù)中,設(shè)置 capacity 容量 12G叹侄,segmentCount 分段數(shù) 1024巩搏,序列化協(xié)議使用 kryo。

2.3 優(yōu)化效果

切換到堆外緩存后趾代,服務(wù) YGC 降低到了 800ms / 每分鐘贯底,端到端的整體吞吐量上漲了約 20%。

2.4 缺點(diǎn)

缺點(diǎn)主要是序列化撒强、反序列化禽捆,如果數(shù)據(jù)查詢(xún)特別高頻,那反序列化的成本就不可忽略了飘哨。

3 應(yīng)用場(chǎng)景

OHC適合將離線(xiàn)數(shù)據(jù)進(jìn)行本地緩存睦擂,從而節(jié)省訪(fǎng)問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)的時(shí)間。

網(wǎng)上看到的具體應(yīng)用場(chǎng)景杖玲,主要是在推薦服務(wù)中用到顿仇,比如 Java堆外緩存OHC在馬蜂窩推薦引擎的應(yīng)用 , vivo的推薦服務(wù)計(jì)算中也有用到摆马。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臼闻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子囤采,更是在濱河造成了極大的恐慌述呐,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕉毯,死亡現(xiàn)場(chǎng)離奇詭異乓搬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)代虾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)进肯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人棉磨,你說(shuō)我怎么就攤上這事江掩。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵环形,是天一觀的道長(zhǎng)策泣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)抬吟,這世上最難降的妖魔是什么萨咕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮火本,結(jié)果婚禮上危队,老公的妹妹穿的比我還像新娘。我一直安慰自己发侵,他們只是感情好交掏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著刃鳄,像睡著了一般盅弛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叔锐,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天挪鹏,我揣著相機(jī)與錄音,去河邊找鬼愉烙。 笑死讨盒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的步责。 我是一名探鬼主播返顺,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔓肯!你這毒婦竟也來(lái)了遂鹊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蔗包,失蹤者是張志新(化名)和其女友劉穎秉扑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體调限,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舟陆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耻矮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦躯。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淘钟,靈堂內(nèi)的尸體忽然破棺而出宦赠,到底是詐尸還是另有隱情陪毡,我是刑警寧澤米母,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布勾扭,位于F島的核電站,受9級(jí)特大地震影響铁瞒,放射性物質(zhì)發(fā)生泄漏妙色。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一慧耍、第九天 我趴在偏房一處隱蔽的房頂上張望身辨。 院中可真熱鬧,春花似錦芍碧、人聲如沸煌珊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)定庵。三九已至,卻和暖如春踪危,著一層夾襖步出監(jiān)牢的瞬間蔬浙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工贞远, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畴博,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓蓝仲,卻偏偏與公主長(zhǎng)得像俱病,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袱结,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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