JVM-JVM 性能調(diào)優(yōu)

JVM 性能調(diào)優(yōu)

在高性能硬件上部署程序袖扛,目前主要有兩種方式:

  • 通過 64 位 JDK 來使用大內(nèi)存;
  • 使用若干個 32 位虛擬機(jī)建立邏輯集群來利用硬件資源。

使用 64 位 JDK 管理大內(nèi)存

堆內(nèi)存變大后,雖然垃圾收集的頻率減少了曙旭,但每次垃圾回收的時間變長。 如果堆內(nèi)存為 14 G晶府,那么每次 Full GC 將長達(dá)數(shù)十秒桂躏。如果 Full GC 頻繁發(fā)生,那么對于一個網(wǎng)站來說是無法忍受的川陆。

對于用戶交互性強(qiáng)剂习、對停頓時間敏感的系統(tǒng),可以給 Java 虛擬機(jī)分配超大堆的前提是有把握把應(yīng)用程序的 Full GC 頻率控制得足夠低书劝,至少要低到不會影響用戶使用进倍。

可能面臨的問題:

  • 內(nèi)存回收導(dǎo)致的長時間停頓;
  • 現(xiàn)階段购对,64 位 JDK 的性能普遍比 32 位 JDK 低猾昆;
  • 需要保證程序足夠穩(wěn)定,因為這種應(yīng)用要是產(chǎn)生堆溢出幾乎就無法產(chǎn)生堆轉(zhuǎn)儲快照(因為要產(chǎn)生超過 10GB 的 Dump 文件)骡苞,哪怕產(chǎn)生了快照也幾乎無法進(jìn)行分析垂蜗;
  • 相同程序在 64 位 JDK 消耗的內(nèi)存一般比 32 位 JDK 大楷扬,這是由于指針膨脹,以及數(shù)據(jù)類型對齊補(bǔ)白等因素導(dǎo)致的贴见。

使用 32 位 JVM 建立邏輯集群

在一臺物理機(jī)器上啟動多個應(yīng)用服務(wù)器進(jìn)程烘苹,每個服務(wù)器進(jìn)程分配不同端口, 然后在前端搭建一個負(fù)載均衡器片部,以反向代理的方式來分配訪問請求镣衡。

考慮到在一臺物理機(jī)器上建立邏輯集群的目的僅僅是為了盡可能利用硬件資源,并不需要關(guān)心狀態(tài)保留档悠、熱轉(zhuǎn)移之類的高可用性能需求廊鸥, 也不需要保證每個虛擬機(jī)進(jìn)程有絕對的均衡負(fù)載,因此使用無 Session 復(fù)制的親合式集群是一個不錯的選擇辖所。 我們僅僅需要保障集群具備親合性惰说,也就是均衡器按一定的規(guī)則算法(一般根據(jù) SessionID 分配) 將一個固定的用戶請求永遠(yuǎn)分配到固定的一個集群節(jié)點進(jìn)行處理即可。

可能遇到的問題:

  • 盡量避免節(jié)點競爭全局資源缘回,如磁盤競爭吆视,各個節(jié)點如果同時訪問某個磁盤文件的話,很可能導(dǎo)致 IO 異常酥宴;
  • 很難高效利用資源池啦吧,如連接池,一般都是在節(jié)點建立自己獨(dú)立的連接池幅虑,這樣有可能導(dǎo)致一些節(jié)點池滿了而另外一些節(jié)點仍有較多空余丰滑;
  • 各個節(jié)點受到 32 位的內(nèi)存限制;
  • 大量使用本地緩存的應(yīng)用倒庵,在邏輯集群中會造成較大的內(nèi)存浪費(fèi),因為每個邏輯節(jié)點都有一份緩存炫刷,這時候可以考慮把本地緩存改成集中式緩存擎宝。

JetBrains軟件使用

調(diào)優(yōu)案例分析與實戰(zhàn)

場景描述

一個小型系統(tǒng),使用 32 位 JDK浑玛,4G 內(nèi)存绍申,測試期間發(fā)現(xiàn)服務(wù)端不定時拋出內(nèi)存溢出異常。 加入 -XX:+HeapDumpOnOutOfMemoryError(添加這個參數(shù)后顾彰,堆內(nèi)存溢出時就會輸出異常日志)极阅, 但再次發(fā)生內(nèi)存溢出時,沒有生成相關(guān)異常日志涨享。

分析

在 32 位 JDK 上筋搏,1.6G 分配給堆,還有一部分分配給 JVM 的其他內(nèi)存厕隧,直接內(nèi)存最大也只能在剩余的 0.4G 空間中分出一部分奔脐, 如果使用了 NIO俄周,JVM 會在 JVM 內(nèi)存之外分配內(nèi)存空間,那么就要小心“直接內(nèi)存”不足時發(fā)生內(nèi)存溢出異常了髓迎。

直接內(nèi)存的回收過程

直接內(nèi)存雖然不是 JVM 內(nèi)存空間峦朗,但它的垃圾回收也由 JVM 負(fù)責(zé)。

垃圾收集進(jìn)行時排龄,虛擬機(jī)雖然會對直接內(nèi)存進(jìn)行回收波势, 但是直接內(nèi)存卻不能像新生代、老年代那樣橄维,發(fā)現(xiàn)空間不足了就通知收集器進(jìn)行垃圾回收艰亮, 它只能等老年代滿了后 Full GC,然后“順便”幫它清理掉內(nèi)存的廢棄對象挣郭。 否則只能一直等到拋出內(nèi)存溢出異常時迄埃,先 catch 掉,再在 catch 塊里大喊 “System.gc()”兑障。 要是虛擬機(jī)還是不聽侄非,那就只能眼睜睜看著堆中還有許多空閑內(nèi)存,自己卻不得不拋出內(nèi)存溢出異常了流译。

JVM 性能調(diào)優(yōu)

在高性能硬件上部署程序逞怨,目前主要有兩種方式:

  • 通過 64 位 JDK 來使用大內(nèi)存;
  • 使用若干個 32 位虛擬機(jī)建立邏輯集群來利用硬件資源福澡。

使用 64 位 JDK 管理大內(nèi)存

堆內(nèi)存變大后叠赦,雖然垃圾收集的頻率減少了,但每次垃圾回收的時間變長革砸。 如果堆內(nèi)存為 14 G除秀,那么每次 Full GC 將長達(dá)數(shù)十秒。如果 Full GC 頻繁發(fā)生算利,那么對于一個網(wǎng)站來說是無法忍受的册踩。

對于用戶交互性強(qiáng)、對停頓時間敏感的系統(tǒng)效拭,可以給 Java 虛擬機(jī)分配超大堆的前提是有把握把應(yīng)用程序的 Full GC 頻率控制得足夠低暂吉,至少要低到不會影響用戶使用。

可能面臨的問題:

  • 內(nèi)存回收導(dǎo)致的長時間停頓缎患;
  • 現(xiàn)階段慕的,64 位 JDK 的性能普遍比 32 位 JDK 低;
  • 需要保證程序足夠穩(wěn)定挤渔,因為這種應(yīng)用要是產(chǎn)生堆溢出幾乎就無法產(chǎn)生堆轉(zhuǎn)儲快照(因為要產(chǎn)生超過 10GB 的 Dump 文件)肮街,哪怕產(chǎn)生了快照也幾乎無法進(jìn)行分析;
  • 相同程序在 64 位 JDK 消耗的內(nèi)存一般比 32 位 JDK 大蚂蕴,這是由于指針膨脹低散,以及數(shù)據(jù)類型對齊補(bǔ)白等因素導(dǎo)致的俯邓。

使用 32 位 JVM 建立邏輯集群

在一臺物理機(jī)器上啟動多個應(yīng)用服務(wù)器進(jìn)程,每個服務(wù)器進(jìn)程分配不同端口熔号, 然后在前端搭建一個負(fù)載均衡器稽鞭,以反向代理的方式來分配訪問請求。

考慮到在一臺物理機(jī)器上建立邏輯集群的目的僅僅是為了盡可能利用硬件資源引镊,并不需要關(guān)心狀態(tài)保留朦蕴、熱轉(zhuǎn)移之類的高可用性能需求, 也不需要保證每個虛擬機(jī)進(jìn)程有絕對的均衡負(fù)載弟头,因此使用無 Session 復(fù)制的親合式集群是一個不錯的選擇吩抓。 我們僅僅需要保障集群具備親合性,也就是均衡器按一定的規(guī)則算法(一般根據(jù) SessionID 分配) 將一個固定的用戶請求永遠(yuǎn)分配到固定的一個集群節(jié)點進(jìn)行處理即可赴恨。

可能遇到的問題:

  • 盡量避免節(jié)點競爭全局資源疹娶,如磁盤競爭,各個節(jié)點如果同時訪問某個磁盤文件的話伦连,很可能導(dǎo)致 IO 異常雨饺;
  • 很難高效利用資源池,如連接池惑淳,一般都是在節(jié)點建立自己獨(dú)立的連接池额港,這樣有可能導(dǎo)致一些節(jié)點池滿了而另外一些節(jié)點仍有較多空余;
  • 各個節(jié)點受到 32 位的內(nèi)存限制歧焦;
  • 大量使用本地緩存的應(yīng)用移斩,在邏輯集群中會造成較大的內(nèi)存浪費(fèi),因為每個邏輯節(jié)點都有一份緩存绢馍,這時候可以考慮把本地緩存改成集中式緩存向瓷。

資源分享:

JAVA開發(fā)2T電子書分享:JAVA開發(fā)2T電子書分享提取碼:knPG

調(diào)優(yōu)案例分析與實戰(zhàn)

場景描述

一個小型系統(tǒng),使用 32 位 JDK痕貌,4G 內(nèi)存风罩,測試期間發(fā)現(xiàn)服務(wù)端不定時拋出內(nèi)存溢出異常。 加入 -XX:+HeapDumpOnOutOfMemoryError(添加這個參數(shù)后舵稠,堆內(nèi)存溢出時就會輸出異常日志), 但再次發(fā)生內(nèi)存溢出時入宦,沒有生成相關(guān)異常日志哺徊。

分析

在 32 位 JDK 上,1.6G 分配給堆乾闰,還有一部分分配給 JVM 的其他內(nèi)存落追,直接內(nèi)存最大也只能在剩余的 0.4G 空間中分出一部分, 如果使用了 NIO涯肩,JVM 會在 JVM 內(nèi)存之外分配內(nèi)存空間轿钠,那么就要小心“直接內(nèi)存”不足時發(fā)生內(nèi)存溢出異常了巢钓。

直接內(nèi)存的回收過程

直接內(nèi)存雖然不是 JVM 內(nèi)存空間,但它的垃圾回收也由 JVM 負(fù)責(zé)疗垛。

垃圾收集進(jìn)行時症汹,虛擬機(jī)雖然會對直接內(nèi)存進(jìn)行回收, 但是直接內(nèi)存卻不能像新生代贷腕、老年代那樣背镇,發(fā)現(xiàn)空間不足了就通知收集器進(jìn)行垃圾回收, 它只能等老年代滿了后 Full GC泽裳,然后“順便”幫它清理掉內(nèi)存的廢棄對象瞒斩。 否則只能一直等到拋出內(nèi)存溢出異常時,先 catch 掉涮总,再在 catch 塊里大喊 “System.gc()”胸囱。 要是虛擬機(jī)還是不聽,那就只能眼睜睜看著堆中還有許多空閑內(nèi)存瀑梗,自己卻不得不拋出內(nèi)存溢出異常了烹笔。

本文由mdnice多平臺發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夺克,隨后出現(xiàn)的幾起案子箕宙,更是在濱河造成了極大的恐慌,老刑警劉巖铺纽,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬帕,死亡現(xiàn)場離奇詭異,居然都是意外死亡狡门,警方通過查閱死者的電腦和手機(jī)陷寝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來其馏,“玉大人凤跑,你說我怎么就攤上這事∨迅矗” “怎么了仔引?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褐奥。 經(jīng)常有香客問我咖耘,道長,這世上最難降的妖魔是什么撬码? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任儿倒,我火速辦了婚禮,結(jié)果婚禮上呜笑,老公的妹妹穿的比我還像新娘夫否。我一直安慰自己彻犁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布凰慈。 她就那樣靜靜地躺著汞幢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溉瓶。 梳的紋絲不亂的頭發(fā)上急鳄,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音堰酿,去河邊找鬼疾宏。 笑死,一個胖子當(dāng)著我的面吹牛触创,可吹牛的內(nèi)容都是我干的坎藐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哼绑,長吁一口氣:“原來是場噩夢啊……” “哼岩馍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抖韩,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛀恩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茂浮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體双谆,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年席揽,在試婚紗的時候發(fā)現(xiàn)自己被綠了顽馋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幌羞,死狀恐怖寸谜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情属桦,我是刑警寧澤熊痴,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站聂宾,受9級特大地震影響愁拭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亏吝,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盏混。 院中可真熱鬧蔚鸥,春花似錦惜论、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弹谁,卻和暖如春乾巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背预愤。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工沟于, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人植康。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓旷太,卻偏偏與公主長得像,于是被迫代替她去往敵國和親销睁。 傳聞我的和親對象是個殘疾皇子奉呛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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