java中垃圾的定義
當(dāng)一個(gè)對(duì)象沒有被任何引用指向 或 對(duì)象存在循環(huán)引用(沒有被根部引用),即這個(gè)對(duì)象會(huì)被視作垃圾神郊。
java垃圾回收機(jī)制
自動(dòng)內(nèi)存回收
編程相對(duì)簡(jiǎn)單,系統(tǒng)不易出錯(cuò)
但是性能會(huì)有一定的影響
如何定位垃圾
引用計(jì)數(shù)(ReferenceCount)(單個(gè)對(duì)象):引用的增加和減少都被記錄屿岂,而引用為0的時(shí)候践宴,就認(rèn)為是垃圾
根可達(dá)算法(java RootSearching)(多個(gè)對(duì)象):以根為起點(diǎn)順藤摸瓜鲸匿,能摸到的都不是垃圾阻肩。
Java中那些被認(rèn)為是根呢?
JVMstack:JVM棧里面的(因?yàn)闂@锩娴臇|西由操作系統(tǒng)自動(dòng)回收烤惊,所有棧里面還有的對(duì)象認(rèn)為是存活的對(duì)象)
native method stack:本地方法棧里面的
runtime constant pool:常量池里面的
static:靜態(tài)的引用
class:加載到內(nèi)存中的類(類會(huì)在new、getstatic柒室、putstatic渡贾、invokestatic時(shí)加載到內(nèi)存中雄右,即new類纺讲、獲取和設(shè)置靜態(tài)變量、調(diào)用靜態(tài)方法時(shí)被加載囤屹,加載之后將不會(huì)被自動(dòng)回收,也不再重新加載)
常見的垃圾回收算法
標(biāo)記清除(mark sweep) - 位置不連續(xù) 產(chǎn)生碎片 效率偏低(兩遍掃描)
拷貝算法 (copying) - 沒有碎片肋坚,浪費(fèi)空間
標(biāo)記壓縮(mark compact) - 沒有碎片,效率偏低(兩遍掃描智厌,指針需要調(diào)整)