問(wèn)題1:垃圾回收策略?
答: 1.引用基數(shù):原理是此對(duì)象有一個(gè)引用就增加一個(gè)計(jì)數(shù),刪除一個(gè)引用就減少一個(gè)計(jì)數(shù)。致命的是無(wú)法處理循環(huán)
引用的問(wèn)題。
2.標(biāo)記清除:第一階段,從引用根節(jié)點(diǎn)開始標(biāo)記所有被引用的對(duì)象
第二階段,遍歷整個(gè)堆,把未標(biāo)記的對(duì)象清除
缺點(diǎn):需要暫停整個(gè)應(yīng)用,同時(shí)產(chǎn)生內(nèi)存碎片
3.復(fù)制:內(nèi)存劃分為兩個(gè)相等的區(qū)域,每次只使用一個(gè)區(qū)域,垃圾回收時(shí),遍歷當(dāng)前使用區(qū)域,把正在使用的對(duì)
象復(fù)制到另一個(gè)區(qū)域,復(fù)制成本小,且可進(jìn)行內(nèi)存整理
缺點(diǎn):需要雙倍內(nèi)存空間
4.標(biāo)記整理:第一階段,從根節(jié)點(diǎn)開始標(biāo)記所有被引用的對(duì)象
第二階段,遍歷整個(gè)堆,壓縮未標(biāo)記對(duì)象到堆的其中一塊,按順序排放
優(yōu)點(diǎn):避免復(fù)制算法的浪費(fèi)空間,也避免內(nèi)存碎片
補(bǔ)充:引用根節(jié)點(diǎn)指的是棧與靜態(tài)變量寄存器之類的。最簡(jiǎn)單的java棧就是java程序執(zhí)行的main函數(shù)--標(biāo)記清除
問(wèn)題2:分代?
答: 1.分代(年輕代,老年代,永久代)是基于不同對(duì)象的生命周期不同,為了提高回收的效率(socket,session這種對(duì)象周期很長(zhǎng),String這種不可變對(duì)象基本用一次就不用了)(標(biāo)記整理)。
2.年輕代:一個(gè)Eden區(qū),兩個(gè)Survivor區(qū)。大部分對(duì)象在Eden區(qū)生成。當(dāng)Eden區(qū)滿,還存活的對(duì)象被復(fù)制到一
個(gè)Survivor區(qū),當(dāng)這個(gè)Survivor區(qū)也滿了,此區(qū)對(duì)象被復(fù)制到另一個(gè)Survivor中,當(dāng)這個(gè)Survivor也滿
了,從第一個(gè)Survivor復(fù)制過(guò)來(lái)的對(duì)象依舊存活的,就轉(zhuǎn)入老年代。兩個(gè)Surivor部分前后兩個(gè)Survivor
總有一個(gè)是空的。新對(duì)象生成申請(qǐng)空間失敗時(shí),觸發(fā)Scavenge GC ,清理Eden到survivor,存活的
survivor復(fù)制到老年代(標(biāo)記清除算法)
3.老年代: 經(jīng)過(guò)多次垃圾回收后依舊存活的對(duì)象,什么周期長(zhǎng)的對(duì)象,比如session,線程之類的(full GC)
4.永久代:靜態(tài)文件,java類,方法之類的,一般堆垃圾回收影響不大,但是動(dòng)態(tài)調(diào)用會(huì)生成新class,比如
hibernate,需要調(diào)大老年代(full GC標(biāo)記清除算法)
---------------------------------------------------------------------------------------------------------------------------------------------------------問(wèn)題3:垃圾收集算法
答: 1.串行垃圾收集器線程:?jiǎn)翁幚砥鳈C(jī)器(很少了現(xiàn)在),數(shù)據(jù)量小的情況下(100m),可使用-
XX:+UseSericalGC打開
2.并行垃圾收集器線程:多核心機(jī)器,不設(shè)置老年代手機(jī)還是單線程的,使用-XX:+UseParallelOldGC打開
缺點(diǎn):響應(yīng)時(shí)間加長(zhǎng)
3.并發(fā)垃圾收集器:對(duì)時(shí)間響應(yīng)敏感的大規(guī)模應(yīng)用,使用-XX:+UseConcMarkSweepGC打開,主要用于減
少老年代暫停時(shí)間
缺點(diǎn):在應(yīng)用云信的同時(shí)進(jìn)行垃圾回收,會(huì)有浮動(dòng)垃圾產(chǎn)生,所以需要預(yù)留百分之二十的空間暫存這些垃圾。
總結(jié):小破機(jī)器用串行垃圾收集器,吞吐量為重的用并行,時(shí)間敏感的用并發(fā)
補(bǔ)充:吞吐量=執(zhí)行用戶代碼時(shí)間/總時(shí)間