OutOfMemoryError系列(4): Metaspace

JVM限制了Java程序的最大內(nèi)存, 修改/指定啟動(dòng)參數(shù)可以改變這種限制缅疟。Java將堆內(nèi)存劃分為多個(gè)部分, 如下圖所示:

【Java8及以上】這些內(nèi)存池的最大值, 由?-Xmx?和?-XX:MaxMetaspaceSize?等JVM啟動(dòng)參數(shù)指定. 如果沒有明確指定, 則根據(jù)平臺(tái)類型(OS版本+JVM版本)和物理內(nèi)存的大小來確定视搏。

java.lang.OutOfMemoryError: Metaspace?錯(cuò)誤所表達(dá)的信息是:?元數(shù)據(jù)區(qū)(Metaspace) 已被用滿

原因分析

如果你是Java老司機(jī), 應(yīng)該對(duì) PermGen 比較熟悉. 但從Java 8開始,內(nèi)存結(jié)構(gòu)發(fā)生重大改變, 不再使用Permgen, 而是引入一個(gè)新的空間: Metaspace. 這種改變基于多方面的考慮, 部分原因列舉如下:

Permgen空間的具體多大很難預(yù)測。指定小了會(huì)造成?java.lang.OutOfMemoryError: Permgen size?錯(cuò)誤, 設(shè)置多了又造成浪費(fèi)姥芥。

為了?GC 性能?的提升, 使得垃圾收集過程中的并發(fā)階段不再?停頓, 另外對(duì) metadata 進(jìn)行特定的遍歷(specific iterators)。

對(duì)?G1垃圾收集器?的并發(fā) class unloading 進(jìn)行深度優(yōu)化。

在Java8中,將之前 PermGen 中的所有內(nèi)容, 都移到了 Metaspace 空間。例如: class 名稱, 字段, 方法, 字節(jié)碼, 常量池, JIT優(yōu)化代碼, 等等塞椎。

Metaspace 的使用量與JVM加載到內(nèi)存中的 class 數(shù)量/大小有關(guān)【Φ停可以說,?java.lang.OutOfMemoryError: Metaspace?錯(cuò)誤的主要原因, 是加載到內(nèi)存中的 class 數(shù)量太多或者體積太大案狠。

示例

和?上一章的PermGen?類似, Metaspace 空間的使用量, 與JVM加載的 class 數(shù)量有很大關(guān)系。下面是一個(gè)簡單的示例:

publicclassMetaspace {staticjavassist.ClassPool cp = javassist.ClassPool.getDefault();publicstaticvoidmain(String[] args) throws Exception{for(inti =0; ; i++) {? ? ? Class c = cp.makeClass("eu.plumbr.demo.Generated"+ i).toClass();? ? }? }}

1

2

3

4

5

6

7

8

9

10

可以看到, 使用?javassist?工具庫生成 class 那是非常簡單钱雷。在 for 循環(huán)中, 動(dòng)態(tài)生成很多class, 最終將這些class加載到 Metaspace 中骂铁。

執(zhí)行這段代碼, 隨著生成的class越來越多, 最后將會(huì)占滿 Metaspace 空間, 拋出?java.lang.OutOfMemoryError: Metaspace. 在Mac OS X上, Java 1.8.0_05 環(huán)境下, 如果設(shè)置了啟動(dòng)參數(shù)?-XX:MaxMetaspaceSize=64m, 大約加載 70000 個(gè)class后JVM就會(huì)掛掉。

解決方案

如果拋出與 Metaspace 有關(guān)的 OutOfMemoryError , 第一解決方案是增加 Metaspace 的大小. 使用下面這樣的啟動(dòng)參數(shù):

-XX:MaxMetaspaceSize=512m

1

這里將 Metaspace 的最大值設(shè)置為 512MB, 如果沒有用完, 就不會(huì)拋出?OutOfMemoryError急波。

有一種看起來很簡單的方案, 是直接去掉 Metaspace 的大小限制。 但需要注意, 不限制Metaspace內(nèi)存的大小, 假若物理內(nèi)存不足, 有可能會(huì)引起內(nèi)存交換(swapping), 嚴(yán)重拖累系統(tǒng)性能瘪校。 此外,還可能造成native內(nèi)存分配失敗等問題澄暮。

在現(xiàn)代應(yīng)用集群中,寧可讓應(yīng)用節(jié)點(diǎn)掛掉, 也不希望其響應(yīng)緩慢名段。

如果不想收到報(bào)警, 可以像鴕鳥一樣, 把?java.lang.OutOfMemoryError: Metaspace?錯(cuò)誤信息隱藏起來。 但這不能真正解決問題, 只會(huì)推遲問題爆發(fā)的時(shí)間泣懊。 如果確實(shí)存在內(nèi)存泄露, 請(qǐng)參考前面的文章, 認(rèn)真尋找解決方案伸辟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市馍刮,隨后出現(xiàn)的幾起案子信夫,更是在濱河造成了極大的恐慌,老刑警劉巖卡啰,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件静稻,死亡現(xiàn)場離奇詭異,居然都是意外死亡匈辱,警方通過查閱死者的電腦和手機(jī)振湾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亡脸,“玉大人押搪,你說我怎么就攤上這事∏衬耄” “怎么了大州?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垂谢。 經(jīng)常有香客問我厦画,道長,這世上最難降的妖魔是什么埂陆? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任苛白,我火速辦了婚禮,結(jié)果婚禮上焚虱,老公的妹妹穿的比我還像新娘购裙。我一直安慰自己,他們只是感情好鹃栽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布躏率。 她就那樣靜靜地躺著,像睡著了一般民鼓。 火紅的嫁衣襯著肌膚如雪薇芝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天丰嘉,我揣著相機(jī)與錄音夯到,去河邊找鬼。 笑死饮亏,一個(gè)胖子當(dāng)著我的面吹牛耍贾,可吹牛的內(nèi)容都是我干的阅爽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荐开,長吁一口氣:“原來是場噩夢啊……” “哼付翁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晃听,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤百侧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后能扒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佣渴,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年赫粥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了观话。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡越平,死狀恐怖频蛔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秦叛,我是刑警寧澤晦溪,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站挣跋,受9級(jí)特大地震影響三圆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜避咆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一舟肉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧查库,春花似錦路媚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至围苫,卻和暖如春裤园,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剂府。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工拧揽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓淤袜,卻偏偏與公主長得像万俗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饮怯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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