問題1:垃圾回收策略?
答: 1.引用基數(shù):原理是此對象有一個引用就增加一個計數(shù),刪除一個引用就減少一個計數(shù)院水。致命的是無法處理循環(huán)
引用的問題。
2.標記清除:第一階段简十,從引用根節(jié)點開始標記所有被引用的對象
第二階段檬某,遍歷整個堆,把未標記的對象清除
缺點:需要暫停整個應用螟蝙,同時產(chǎn)生內(nèi)存碎片
3.復制:內(nèi)存劃分為兩個相等的區(qū)域恢恼,每次只使用一個區(qū)域,垃圾回收時胰默,遍歷當前使用區(qū)域场斑,把正在使用的對
象復制到另一個區(qū)域,復制成本小初坠,且可進行內(nèi)存整理
缺點:需要雙倍內(nèi)存空間
4.標記整理:第一階段和簸,從根節(jié)點開始標記所有被引用的對象
第二階段彭雾,遍歷整個堆碟刺,壓縮未標記對象到堆的其中一塊,按順序排放
優(yōu)點:避免復制算法的浪費空間薯酝,也避免內(nèi)存碎片
補充:引用根節(jié)點指的是棧與靜態(tài)變量寄存器之類的半沽。最簡單的java棧就是java程序執(zhí)行的main函數(shù)--標記清除
問題2:分代爽柒?
答: 1.分代(年輕代,老年代者填,永久代)是基于不同對象的生命周期不同浩村,為了提高回收的效率(socket,session這種對象周期很長占哟,String這種不可變對象基本用一次就不用了)(標記整理)心墅。
2.年輕代:一個Eden區(qū),兩個Survivor區(qū)榨乎。大部分對象在Eden區(qū)生成怎燥。當Eden區(qū)滿,還存活的對象被復制到一
個Survivor區(qū)蜜暑,當這個Survivor區(qū)也滿了铐姚,此區(qū)對象被復制到另一個Survivor中,當這個Survivor也滿
了肛捍,從第一個Survivor復制過來的對象依舊存活的隐绵,就轉(zhuǎn)入老年代。兩個Surivor部分前后兩個Survivor
總有一個是空的拙毫。新對象生成申請空間失敗時依许,觸發(fā)Scavenge GC ,清理Eden到survivor缀蹄,存活的
survivor復制到老年代(標記清除算法)
3.老年代: 經(jīng)過多次垃圾回收后依舊存活的對象悍手,什么周期長的對象,比如session袍患,線程之類的(full GC)
4.永久代:靜態(tài)文件坦康,java類,方法之類的诡延,一般堆垃圾回收影響不大滞欠,但是動態(tài)調(diào)用會生成新class,比如
hibernate肆良,需要調(diào)大老年代(full GC標記清除算法)
---------------------------------------------------------------------------------------------------------------------------------------------------------問題3:垃圾收集算法
答: 1.串行垃圾收集器線程:單處理器機器(很少了現(xiàn)在)筛璧,數(shù)據(jù)量小的情況下(100m),可使用-
XX:+UseSericalGC打開
2.并行垃圾收集器線程:多核心機器惹恃,不設(shè)置老年代手機還是單線程的夭谤,使用-XX:+UseParallelOldGC打開
缺點:響應時間加長
3.并發(fā)垃圾收集器:對時間響應敏感的大規(guī)模應用,使用-XX:+UseConcMarkSweepGC打開巫糙,主要用于減
少老年代暫停時間
缺點:在應用云信的同時進行垃圾回收朗儒,會有浮動垃圾產(chǎn)生,所以需要預留百分之二十的空間暫存這些垃圾。
總結(jié):小破機器用串行垃圾收集器醉锄,吞吐量為重的用并行乏悄,時間敏感的用并發(fā)
補充:吞吐量=執(zhí)行用戶代碼時間/總時間