1. 程式人生 > >Hadoop記憶體溢位(OOM)分類、引數調優化(程式碼模擬記憶體溢位型別並分析原因)

Hadoop記憶體溢位(OOM)分類、引數調優化(程式碼模擬記憶體溢位型別並分析原因)

Java GC的角度解:程式20newPerson物件會首先會進Eden中(如果象太大可能直接年老代)。在GC之前象是存在Edenfrom中的,GCEden中的象被拷To這樣一個survivesurvive倖存)空:包括fromto,他的空大小是一的,又叫s1s2)中(有一個拷演算法),From中的象(演算法會考慮經過GC倖存的次數)到一定次數閾值如果每次GC之後象依舊在Survive中存在,GC一次他的Age就會加1,默15就會放到Old Generation。但是實際情況比,有可能沒有到閾值就從Survive
區域直接到Old Generation區域。在GC候會Survive中的行判斷,Survive中有一些Age是一的,也就是經過GC次數一,年相同的這樣一批象的和大於等於Survive一半的這組對象就會old Generation中,(是一種動態調整))),會被複制到Old Generation,如果沒到次數From中的象會被複制到To中,複製完成後To中儲存的是有效的象,EdenFrom中剩下的都是無效的象,候就把EdenFrom中所有的象清空。在複製的Eden中的To中,To可能已經滿了,Eden中的象就會被直接複製到
OldGeneration中,From中的象也會直接Old Generation中。就是存在這樣一種情況,To小,第一次複製的候空滿了,直接old Generation中。複製完成後,ToFrom的名字會對調一下,因EdenFrom都是空的,對調EdenTo都是空的,下次分配就會分配到Eden。一直循環這個流程。好:使用象最多和效率最高的就是在Young Generation中,通From to就避免繁的Full GCOld Generation滿了一般都會產生FullGC機在MinorGC(新生代的GC)的候,會判斷要Old Generation
區域象的大小,是否大於Old Generation剩餘空大小,如果大於就會Full GC剛分配物件在Eden中,如果空不足嘗試進GC,回收空,如果行了MinorGC依舊不就放入Old Generation,如果OldGeneration間還OOM了。大的象,數等,大於某(可配置)就直接分配到老年代,(避免繁記憶體拷代和年老代屬於HeapPermanent Generation(永久代)可以理解成方法區,(它屬於方法區)也有可能GC,例如象全部被GC了,同它的器也被GC掉了,候就會觸永久代中象的GC如果OldGeneration滿了就會產生FullGC