1? ? java為什么需要自動垃圾回收
? ? 如果Java中沒有自動垃圾回收機(jī)制派阱,則通常會出現(xiàn)兩種問題
? ? a? ? 忘記回收
? ? ? ? ? ?忘記回收就會出現(xiàn)內(nèi)存泄漏脑题,最后產(chǎn)生內(nèi)存溢出
? ? b? ? 多次回收
? ? ? ? ? ? 多次回收闹获,在一些條件下面對象引用的空間已經(jīng)回收了硫惕,并且這塊空間被新的對象引用蛇受,但是原對象引用依舊指向這個地址雹顺,就會差生誤刪數(shù)據(jù)
2? ? 什么是垃圾
? ? ? ? a? ? 沒有任何引用指向它的對象
? ? ? ? b? ?沒有外部指向的多個對象
3? ? 怎么定位垃圾
? ? ? ? a? ? refeence count(引用計數(shù))
? ? ? ? ? ? ? ?對象持有被引用的個數(shù)丹墨,沒增加一個引用,計數(shù)加1嬉愧,反之贩挣,減1,但引用計數(shù)為0的時候表示沒有任何引用指向這個對象了
? ? ? ? ? ? ? ? 缺點(無法解決多個對象循環(huán)被引用没酣,并且這幾個對象沒有被外部引用)
? ? ? ? b? ? GC roots(根可達(dá)算法)
? ? ? ? ? ? ? ? gc roots包括
? ? ? ? ? ? ? ? ? ? 被系統(tǒng)加載器或者根加載器加載的class類王财,部分自定義加載器的class
? ? ? ? ? ? ? ? ? ? 處于激活中的線程
? ? ? ? ? ? ? ? ? ? 方法棧中的對象
? ? ? ? ? ? ? ? ? ? 本地方法棧中的對象
? ? ? ? ? ? ? ? ? ? 本地方法棧中的全局變量
? ? ? ? ? ? ? ? ? ? 處于正在使用中的鎖對象
? ? ? ? ? ? ? ? ? ? JVM自身持有的對象
? ? ? ? ? ? 不屬于GC root的或者是從gc root上不可以到達(dá)的對象都屬于垃圾
4? ? 常見的垃圾回收算法
? ? a? ? 標(biāo)記清除算法
? ? ? ? 從內(nèi)存中,把屬于垃圾的對象裕便,全部標(biāo)記上绒净,再然后把標(biāo)記的對象的內(nèi)存全部回收
? ? ? ? 缺點:會差生不連續(xù)的垃圾碎片
? ? b? ? 復(fù)制拷貝算法
? ? ? ? 再內(nèi)存使用上,就把內(nèi)存分成兩份偿衰,每次創(chuàng)建對象都在其中的一份上挂疆,回收的時候,把不屬于垃圾的拷貝到另外一份上下翎,然后再把這份內(nèi)存全部回收
? ? ? ? 缺點:需要耗費內(nèi)存
? ? c? ? 標(biāo)記壓縮算法
? ? ? ? 把不是垃圾的對象移動到連續(xù)的內(nèi)存上缤言,整理
? ? ? ? 缺點:時效慢,每移動整理對象的時候都要做同步處理
5? ? JVM內(nèi)存分代模型(用于分代垃圾回收算法)
? ? 部分垃圾回收器使用的模型视事,比如G1胆萧、ZGC垃圾回收器就沒有區(qū)分新生代,老生代
????會產(chǎn)生垃圾回收的地方
????新生代+老生代+永久代(jdk1.7)/元數(shù)據(jù)區(qū)(jdk1.8)
? ? ? ? 永久代/元數(shù)據(jù)區(qū)一般存放 Class
? ?????永久代與元數(shù)據(jù)區(qū)的區(qū)別郑口,永久代必須要設(shè)置大小鸳碧,(當(dāng)應(yīng)用有很多的代理的時候盾鳞,就會產(chǎn)生很多的Class對象犬性,會把永久代撐爆,出現(xiàn)內(nèi)存溢出)元數(shù)據(jù)區(qū)可以設(shè)置也可以不設(shè)置腾仅,無限制(受限于物理內(nèi)存)
? ? ? ? 永久帶存放字符串常量乒裆,元數(shù)據(jù)區(qū)不存在,把這塊交給了堆推励,元數(shù)據(jù)區(qū)的回收不屬于JVM管理鹤耍,由系統(tǒng)控制
? ? ? ? 一般新生代:老生代 = 1 : 3
? ? 新生代=Eden+2個suvivor區(qū)
? ?Eden : s0 :s1 = 8 : 1 : 1
? ? 新生代中的對象一般默認(rèn)存活率很少肉迫,有90%的都會被回收
? ? ? ? a? ? 再進(jìn)行過一個YGC后,大部分對象被回收稿黄,剩下的活著對象進(jìn)入s0
? ? ? ? b? ? 再次YGC喊衫,把Eden和s0區(qū)活著的對象放入s1區(qū)
? ? ? ? c? ? 再次YGC,把Eden和s1區(qū)活著的對象放入s0區(qū)
????????什么時候?qū)ο筮M(jìn)入老生代
? ? ? ? a? ? 年齡足夠的情況下杆怕,對象進(jìn)入老生代族购,新生代中的對象每經(jīng)過一次YGC,年齡就加1陵珍,一般默認(rèn)的年齡是15寝杖,CMS默認(rèn)年齡6
? ? ? ? b? ? Eden區(qū)進(jìn)行YGC,活著的對象太多了互纯,s區(qū)裝不下了瑟幕,就進(jìn)入老生代
? ? ? ? c? ? 在創(chuàng)建對象的時候,對象很大留潦,Eden區(qū)分配不出來只盹,也進(jìn)入老生代
? ? ? ? 當(dāng)老生代滿了的時候就會進(jìn)行Full Gc
一般我們gc調(diào)優(yōu)的目的就是盡量減少Full Gc次數(shù)
6? ? 常見的垃圾回收器
????a? ? Serial? ? a stop the world .copying collector which uses a single GC thread(新生代,串行回收)
? ? b? ? Parallel Scavenge? a stop the world which uses multiple GC thread(新生代愤兵,并行回收)
? ? c????ParNew(新生代鹿霸,配合CMS并行回收)
? ? d????Serial Old(老生代)
? ? e????Parallel Old? ?(老生代)
? ? f? ? ?CMS????(老生代,并發(fā)的秆乳,垃圾回收和應(yīng)用程序同時進(jìn)行)
? ? g? ? G1
? ? h? ? ZGC(zero gc)
? ? jdk8默認(rèn)的垃圾回收器??Parallel Scavenge? +?Parallel Old?
第一次寫懦鼠,希望大佬們多多指教