第十九周

1萝映、 簡(jiǎn)述JVM垃圾回收算法分類

常用的垃圾回收算法有如下四種:標(biāo)記-清除、復(fù)制罩阵、標(biāo)記-整理和分代收集竿秆。

標(biāo)記-清除算法

從算法的名稱上可以看出,這個(gè)算法分為兩部分稿壁,標(biāo)記和清除幽钢。首先標(biāo)記出所有需要被回收的對(duì)象,然后在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對(duì)象傅是。

這個(gè)算法簡(jiǎn)單匪燕,但是有兩個(gè)缺點(diǎn):一是標(biāo)記和清除的效率不是很高;二是標(biāo)記和清除后會(huì)產(chǎn)生很多的內(nèi)存碎片喧笔,導(dǎo)致可用的內(nèi)存空間不連續(xù)帽驯,當(dāng)分配大對(duì)象的時(shí)候,沒有足夠的空間時(shí)不得不提前觸發(fā)一次垃圾回收溃斋。

復(fù)制算法

這個(gè)算法將可用的內(nèi)存空間分為大小相等的兩塊界拦,每次只是用其中的一塊吸申,當(dāng)這一塊被用完的時(shí)候梗劫,就將還存活的對(duì)象復(fù)制到另一塊中,然后把原已使用過的那一塊內(nèi)存空間一次回收掉截碴。這個(gè)算法常用于新生代的垃圾回收梳侨。

復(fù)制算法解決了標(biāo)記-清除算法的效率問題,以空間換時(shí)間日丹,但是當(dāng)存活對(duì)象非常多的時(shí)候走哺,復(fù)制操作效率將會(huì)變低,而且每次只能使用一半的內(nèi)存空間哲虾,利用率不高丙躏。

標(biāo)記-整理算法

這個(gè)算法分為三部分:一是標(biāo)記出所有需要被回收的對(duì)象;二是把所有存活的對(duì)象都向一端移動(dòng)束凑;三是把所有存活對(duì)象邊界以外的內(nèi)存空間都回收掉晒旅。

標(biāo)記-整理算法解決了復(fù)制算法多復(fù)制效率低、空間利用率低的問題汪诉,同時(shí)也解決了內(nèi)存碎片的問題废恋。

分代收集算法

根據(jù)對(duì)象生存周期的不同將內(nèi)存空間劃分為不同的塊谈秫,然后對(duì)不同的塊使用不同的回收算法。一般把Java堆分為新生代和老年代鱼鼓,新生代中對(duì)象的存活周期短拟烫,只有少量存活的對(duì)象,所以可以使用復(fù)制算法迄本,而老年代中對(duì)象存活時(shí)間長(zhǎng)硕淑,而且對(duì)象比較多,所以可以采用標(biāo)記-清除和標(biāo)記-整理算法岸梨。

2喜颁、 敘述JVM常用的調(diào)優(yōu)參數(shù)

-Xmx :堆的最大值?

-Xms :堆的最小值,即初始值? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?##可以讓xms=xmx

-XX:NewSize=1024MB :新生代初始大小

-XX:MaxNewSize=1024MB :新生代最大值

-XX:NewRatio=m :New和Old的比值

-Xmn=1024MB :新生代大小? ? ? ? ? ? ? ? ? ? ? ? ? ##一般使用-Xmn來(lái)固定新生代大小

-XX:SurvivorRatio=m :Eden和Survivor的比值

-XX:TargetSurvivorRatio=n :minor GC后Survivor預(yù)期被占用的比例

-XX:+UseConcMarkSweepGC :新生代使用ParNew曹阔,老生代優(yōu)先使用CMS半开,備用方式為Serial Old

-XX:+CMSFullGCsBeforeCompaction : 在多少次回收后執(zhí)行一次內(nèi)存碎片整理

-XX:+PrintTenuringDistribution :查看每次minor GC后年齡的分布和計(jì)算出來(lái)的TenuringThreshold

-XX:+PrintGC :輸出GC簡(jiǎn)要信息

-XX:+PrintGCDetails :輸出GC信息

-XX:+PrintGCTimeStamps :輸出GC時(shí)間戳

-XX:+PrintGCApplicationStoppedTime :輸出GC暫停時(shí)間

-Xlogg c:/gc.log? ? ? ? 輸出到文件

3、 JAVA進(jìn)程發(fā)生OOM如何調(diào)優(yōu)

最常見的OOM情況有以下三種:

?? ? java.lang.OutOfMemoryError: Java heap space ------>java堆內(nèi)存溢出赃份,此種情況最常見寂拆,一般由于內(nèi)存泄露或者堆的大小設(shè)置不當(dāng)引起。對(duì)于內(nèi)存泄露抓韩,需要通過內(nèi)存監(jiān)控軟件查找程序中的泄露代碼纠永,而堆大小可以通過虛擬機(jī)參數(shù)-Xms,-Xmx等修改。

?? ? java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出谒拴,即方法區(qū)溢出了尝江,一般出現(xiàn)于大量Class或者jsp頁(yè)面,或者采用cglib等反射機(jī)制的情況英上,因?yàn)樯鲜銮闆r會(huì)產(chǎn)生大量的Class信息存儲(chǔ)于方法區(qū)炭序。此種情況可以通過更改方法區(qū)的大小來(lái)解決,使用類似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改苍日。另外惭聂,過多的常量尤其是字符串也會(huì)導(dǎo)致方法區(qū)溢出。

?? ? java.lang.StackOverflowError ------> 不會(huì)拋OOM error相恃,但也是比較常見的Java內(nèi)存溢出辜纲。JAVA虛擬機(jī)棧溢出,一般是由于程序中存在死循環(huán)或者深度遞歸調(diào)用造成的拦耐,棧大小設(shè)置太小也會(huì)出現(xiàn)此種溢出耕腾。可以通過虛擬機(jī)參數(shù)-Xss來(lái)設(shè)置棧的大小杀糯。

OOM分析--heapdump

要dump堆的內(nèi)存鏡像扫俺,可以采用如下兩種方式:

?? ? 設(shè)置JVM參數(shù)-XX:+HeapDumpOnOutOfMemoryError,設(shè)定當(dāng)發(fā)生OOM時(shí)自動(dòng)dump出堆信息火脉。不過該方法需要JDK5以上版本牵舵。

?? ? 使用JDK自帶的jmap命令柒啤。"jmap -dump:format=b,file=heap.bin <pid>"? 其中pid可以通過jps獲取。

dump堆內(nèi)存信息后畸颅,需要對(duì)dump出的文件進(jìn)行分析担巩,從而找到OOM的原因。常用的工具有:

?? ? mat: eclipse memory analyzer, 基于eclipse RCP的內(nèi)存分析工具没炒。

?? ? jhat:JDK自帶的java heap analyze tool涛癌,可以將堆中的對(duì)象以html的形式顯示出來(lái),包括對(duì)象的數(shù)量送火,大小等等拳话。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市种吸,隨后出現(xiàn)的幾起案子弃衍,更是在濱河造成了極大的恐慌,老刑警劉巖坚俗,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镜盯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡猖败,警方通過查閱死者的電腦和手機(jī)速缆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)恩闻,“玉大人艺糜,你說我怎么就攤上這事〈鄙校” “怎么了破停?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)侠草。 經(jīng)常有香客問我辱挥,道長(zhǎng)犁嗅,這世上最難降的妖魔是什么边涕? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮褂微,結(jié)果婚禮上功蜓,老公的妹妹穿的比我還像新娘。我一直安慰自己宠蚂,他們只是感情好式撼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著求厕,像睡著了一般著隆。 火紅的嫁衣襯著肌膚如雪扰楼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天美浦,我揣著相機(jī)與錄音弦赖,去河邊找鬼。 笑死浦辨,一個(gè)胖子當(dāng)著我的面吹牛蹬竖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播流酬,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼币厕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了芽腾?” 一聲冷哼從身側(cè)響起旦装,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摊滔,沒想到半個(gè)月后同辣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惭载,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年旱函,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片描滔。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棒妨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出含长,到底是詐尸還是另有隱情券腔,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布拘泞,位于F島的核電站纷纫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏陪腌。R本人自食惡果不足惜辱魁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诗鸭。 院中可真熱鬧染簇,春花似錦、人聲如沸强岸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝌箍。三九已至青灼,卻和暖如春暴心,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杂拨。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工酷勺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扳躬。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓脆诉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贷币。 傳聞我的和親對(duì)象是個(gè)殘疾皇子击胜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353