垃圾收集機(jī)制是什么意思

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)垃圾收集機(jī)制是什么意思,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比齊河網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式齊河網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋齊河地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴(lài)。

在上一篇中我們說(shuō)過(guò),自動(dòng)內(nèi)存管理分為兩部分:給對(duì)象分配內(nèi)存和回收分配給對(duì)象的內(nèi)存。這篇我們說(shuō)說(shuō)后者,即回收分配給對(duì)象的內(nèi)存?;厥諆?nèi)存要用到垃圾收集機(jī)制,英文名兒是GC(Garbage Collection)。

在本部分我們要解決如下幾個(gè)問(wèn)題:

1、哪些內(nèi)存需要回收?

2、什么時(shí)候回收?

3、如何回收?

哪些內(nèi)存需要回收?

堆和方法區(qū)的內(nèi)存需要回收,其余的不需要回收。
因?yàn)橹挥卸押头椒▍^(qū)是線程共享的,其余的是與線程“同生共死”的,線程結(jié)束,內(nèi)存自然就跟著回收了,所以不用管它們。

什么時(shí)候回收?

(1)在堆里面:

當(dāng)對(duì)象“死了”的時(shí)候就要對(duì)其進(jìn)行內(nèi)存回收了。啥叫對(duì)象死了?就是沒(méi)有地方引用它了,它無(wú)用了。那怎么判斷它是否死了呢?

有兩種方法:

引用計(jì)數(shù)算法

給對(duì)象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器的值就+1,當(dāng)引用失效時(shí),計(jì)數(shù)器的值就-1,當(dāng)計(jì)數(shù)器的值為0時(shí),代表此對(duì)象已不被引用,也就是“可以死了”。

但這有一個(gè)弊端,就是循環(huán)引用的問(wèn)題。就像下圖,堆里的兩個(gè)對(duì)象即使無(wú)用了也沒(méi)辦法對(duì)其進(jìn)行回收,因?yàn)樗鼈兓ハ嘁弥?,?jì)數(shù)器的值至少為1。

垃圾收集機(jī)制是什么意思

可達(dá)性分析

所有生成的對(duì)象都是一個(gè)稱(chēng)為“GC Roots”的根的子樹(shù)。從GC Roots開(kāi)始向下搜索,搜索所經(jīng)過(guò)的路徑稱(chēng)為引用鏈。當(dāng)一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈可以到達(dá)時(shí),就稱(chēng)這個(gè)對(duì)象是不可達(dá)的,也就是可以被GC回收了。這個(gè)是Java中采用較多的方式。

就像下圖中的堆中未被引用的對(duì)象,就可以對(duì)其進(jìn)行回收。

垃圾收集機(jī)制是什么意思

怎么判斷一個(gè)對(duì)象是否還存在著引用?java中的引用分為4種:

強(qiáng)引用:Object o=new Object(),只要強(qiáng)引用存在,GC永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象。

軟引用:描述一些還有用但非必需的對(duì)象。當(dāng)系統(tǒng)即將發(fā)生內(nèi)存溢出了,就會(huì)對(duì)其進(jìn)行回收。

弱引用:只要進(jìn)行GC,就會(huì)對(duì)其進(jìn)行回收。

虛引用:這是最弱的一種引用關(guān)系,無(wú)法通過(guò)虛引用來(lái)取得一個(gè)對(duì)象實(shí)例。它的作用是:能在這個(gè)對(duì)象被收集器回收時(shí)收到一個(gè)系統(tǒng)通知。

(2)在方法區(qū)里面:

我們知道,方法區(qū)里存儲(chǔ)的是已被虛擬機(jī)加載的類(lèi)信息,常量,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。所以我們?cè)诜椒▍^(qū)里面進(jìn)行垃圾回收,回收的是一些廢棄的常量和無(wú)用的類(lèi)。

怎么判斷一個(gè)常量是否被廢棄了?

看引用計(jì)數(shù)就可以,如果沒(méi)有對(duì)象引用該常量,則說(shuō)明此常量被廢棄了,也就可以回收了。

怎么判斷一個(gè)類(lèi)是無(wú)用的類(lèi)?

有3種情況:

a、該類(lèi)所有的實(shí)例都已經(jīng)被回收。

b、加載該類(lèi)的ClassLoader已經(jīng)被回收。

c、該類(lèi)對(duì)應(yīng)的java.lang.Class對(duì)象沒(méi)有任何地方被引用,無(wú)法在任何地方通過(guò)反射訪問(wèn)該類(lèi)的方法。

如何回收?

有4種算法作為理論:
? 標(biāo)記-清除算法
? 復(fù)制算法
? 標(biāo)記-整理算法
? 分代收集算法

有5種收集器作為實(shí)現(xiàn):

垃圾收集機(jī)制是什么意思

后記

內(nèi)存溢出:系統(tǒng)無(wú)法再分配出你需要的空間。比如在堆中無(wú)法再給新生的對(duì)象分配內(nèi)存了,在棧里棧滿了無(wú)法再讓新棧幀進(jìn)棧了。

內(nèi)存泄漏:內(nèi)存被對(duì)象占用著不還,就叫內(nèi)存泄露。

上述就是小編為大家分享的垃圾收集機(jī)制是什么意思了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:垃圾收集機(jī)制是什么意思
分享地址:http://bm7419.com/article38/jcsdpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、自適應(yīng)網(wǎng)站網(wǎng)站內(nèi)鏈、App開(kāi)發(fā)、網(wǎng)站排名、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作