欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java詳細(xì)分析梳理垃圾回收機(jī)制

 更新時(shí)間:2022年04月28日 09:08:50   作者:orangemilk_  
垃圾回收,顧名思義,便是將已經(jīng)分配出去的,但卻不再使用的內(nèi)存回收回來,以便能夠再次分配。在?Java?虛擬機(jī)的語境下,垃圾指的是死亡的對(duì)象所占據(jù)的堆空間

Java語言的垃圾回收

1.垃圾回收機(jī)制的基本概念

問:1.什么是Java垃圾回收?

答:在Java語言的生命周期中,Java運(yùn)行環(huán)境提供了一個(gè)系統(tǒng)的垃圾回收器線程,負(fù)責(zé)自動(dòng)回收那些沒有引用與之相連的對(duì)象所占用的內(nèi)存。這種清楚無用對(duì)象進(jìn)行內(nèi)存回收的過程叫做垃圾回收。

問:2.Java垃圾回收的作用是什么?

答:垃圾回收是Java語言提供的一種自動(dòng)內(nèi)存回收的功能,可以讓程序員減輕內(nèi)存管理的負(fù)擔(dān),同時(shí)減少了很多錯(cuò)誤的出現(xiàn)。

問:3.Java垃圾回收的方法是什么?

答: 在一個(gè)類的實(shí)例化對(duì)象創(chuàng)建時(shí),Java虛擬機(jī)JVM會(huì)自動(dòng)給該對(duì)象分配內(nèi)存,調(diào)用該對(duì)象的構(gòu)造方法并開始跟蹤該對(duì)象。當(dāng)該對(duì)象停止使用時(shí),JVM會(huì)通過垃圾回收器回收該對(duì)象所占的內(nèi)存。

問:4.那么,Java是如何知道一個(gè)對(duì)象沒有用的呢?

答:因?yàn)橄到y(tǒng)中的每一個(gè)對(duì)象都有一個(gè)引用計(jì)數(shù)器,如果一個(gè)對(duì)象被引用一次,引用計(jì)數(shù)器相應(yīng)的加1,減少一次引用,相應(yīng)的引用計(jì)數(shù)器減1,以此類推,如果一個(gè)對(duì)象的引用計(jì)數(shù)器為0,則說明這個(gè)對(duì)象該回收了。

-------------------分割線-------------------

實(shí)例代碼段:

Student stu = new Student("張 三",18);
Student stu2=stu;
stu=null;
stu2=new Student("李四",20);

思路:

-------------------分割線-------------------

當(dāng)然除了引用計(jì)數(shù)法判斷對(duì)象是否存活,還有很多的算法去判斷。例如可達(dá)性算法。雖然引用計(jì)數(shù)法原理簡(jiǎn)單,判斷效率高但是同樣存在很多的缺陷。例如對(duì)象的循環(huán)引用時(shí)計(jì)數(shù)器無法判斷等。

//循環(huán)引用示例
public class Student{
    String name;
    Student friend;
    public static void main(String[] args){
        Student s1 = new Student();
        Student s2 = new Student();
        s1.friend = s2;
        s2.friend = s1;
        s1 = null;
        s2 = null;
    }
}
//s1和s2相互引用對(duì)方,導(dǎo)致它們引用計(jì)數(shù)不為0,但是實(shí)際已是無用對(duì)象,但是無法被識(shí)別。

2.Java垃圾回收機(jī)制的好處

  • 很好的解決了對(duì)內(nèi)存的一些操作問題,包括追蹤,監(jiān)測(cè),釋放。
  • 防止系統(tǒng)內(nèi)存被非法釋放,更加穩(wěn)定安全。

3.Java垃圾回收機(jī)制的特點(diǎn)

只有一個(gè)變量不被任何引用類型的變量使用時(shí),它所占用的內(nèi)存才會(huì)被垃圾回收器回收。

例如:

String str1="HelloWorld!";
String str2=str1;
str1=null;
str2=new String("HelloJava");

程序運(yùn)行到第三行時(shí),"Helloworld!"對(duì)象仍然被str2引用,所以不會(huì)被垃圾回收器回收。只有當(dāng)str2引用了一個(gè)新的對(duì)象時(shí),此時(shí)該對(duì)象被當(dāng)作垃圾被回收,例如以上程序運(yùn)行到第四行的時(shí)候。

不能通過程序強(qiáng)迫垃圾回收器立即執(zhí)行

在任何時(shí)候,程序員都不能通過程序強(qiáng)迫垃圾回收器立即執(zhí)行,但是程序員可以通過調(diào)用System.gc()或者Runtime.gc()方法提示垃圾回收器對(duì)垃圾進(jìn)行回收。但是這個(gè)方法只是提醒垃圾回收器對(duì)內(nèi)存進(jìn)行回收,并不一定會(huì)立即執(zhí)行,它只是一個(gè)建議并非命令。

當(dāng)垃圾回收器將要釋放無用內(nèi)存時(shí),先調(diào)用對(duì)象的finalize()方法

當(dāng)然,在Java語言中,垃圾的回收是由系統(tǒng)完成的,但是,有一些任務(wù)例如清理非內(nèi)存資源,這些任務(wù)也可以通過覆蓋Object類的finalize()方法來實(shí)現(xiàn)。

形式:

protected void finalize() throws Throwable

程序可能到運(yùn)行結(jié)束都沒有執(zhí)行垃圾回收

如果一個(gè)程序只占用少量的內(nèi)存,沒有造成嚴(yán)重的內(nèi)存需求,于是垃圾回收器沒有釋放這些對(duì)象的內(nèi)存就退出了。即雖然程序員定義了finalize()方法,JVM不一定調(diào)用它,然后調(diào)用System.gc提供內(nèi)存回收的建議也不會(huì)起作用。因此很難保證使用該方法來釋放資源是安全有效的。

-------------------分割線-------------------

代碼示例:

//filename:GcTest.java
public class GcTest
{
	public static void main(String[] args)
	{
			new GcTest();
			// 下面兩行代碼的作用完全相同,強(qiáng)制系統(tǒng)進(jìn)行垃圾回收
			// System.gc();
			Runtime.getRuntime().gc();
	}
	public void finalize()
	{
		System.out.println("系統(tǒng)正在清理GcTest對(duì)象的資源...");
	}
}

總結(jié)

  • Java的垃圾回收機(jī)制,是C++/C語言的一個(gè)重要的區(qū)別,既減輕了手動(dòng)釋放垃圾內(nèi)存的壓力,又解決了錯(cuò)誤釋放引起的安全問題!
  • 作為Java開發(fā)者,一般不需要專門編寫內(nèi)存回收和垃圾清理代碼,對(duì)內(nèi)存泄露和溢出的問題,也不需要像C程序員那樣嚴(yán)格,Java垃圾回收機(jī)制根據(jù)一定的回收策略,自動(dòng)的回收內(nèi)存,永不停息的保證JVM中的內(nèi)存空間,防止出現(xiàn)內(nèi)存泄露和溢出問題。

到此這篇關(guān)于Java詳細(xì)分析梳理垃圾回收機(jī)制的文章就介紹到這了,更多相關(guān)Java垃圾回收機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring boot攔截器實(shí)現(xiàn)IP黑名單的完整步驟

    Spring boot攔截器實(shí)現(xiàn)IP黑名單的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring boot攔截器實(shí)現(xiàn)IP黑名單的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring boot攔截器具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 簡(jiǎn)單了解如何在spring中使用RabbitMQ

    簡(jiǎn)單了解如何在spring中使用RabbitMQ

    這篇文章主要介紹了簡(jiǎn)單了解如何在spring中使用RabbitMQ,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SpringTask實(shí)現(xiàn)定時(shí)任務(wù)方法講解

    SpringTask實(shí)現(xiàn)定時(shí)任務(wù)方法講解

    通過重寫Schedu lingConfigurer方法實(shí)現(xiàn)對(duì)定時(shí)任務(wù)的操作,單次執(zhí)行、停止、啟動(dòng)三個(gè)主要的基本功能,動(dòng)態(tài)的從數(shù)據(jù)庫中獲取配置的定時(shí)任務(wù)cron信息,通過反射的方式靈活定位到具體的類與方法中
    2023-02-02
  • Java如何為 PPT 中的圖形添加陰影效果

    Java如何為 PPT 中的圖形添加陰影效果

    這篇文章主要介紹了Java如何為 PPT 中的圖形添加陰影效果,幫助大家更好的利用java處理圖像,感興趣的朋友可以了解下
    2020-09-09
  • Hibernate連接三種數(shù)據(jù)庫的配置文件

    Hibernate連接三種數(shù)據(jù)庫的配置文件

    今天小編就為大家分享一篇關(guān)于Hibernate連接三種數(shù)據(jù)庫的配置文件,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息解決

    RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息解決

    這篇文章主要為大家介紹了RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息原因及解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Java 8實(shí)現(xiàn)圖片BASE64編解碼

    Java 8實(shí)現(xiàn)圖片BASE64編解碼

    Java 8終于有了標(biāo)準(zhǔn)的方法來處理base64的編解碼。Java一直缺少BASE64編碼API,以至于通常在項(xiàng)目開發(fā)中會(huì)選用第三方的API實(shí)現(xiàn)。但是,Java 8實(shí)現(xiàn)了BASE64編解碼API,它包含到j(luò)ava.util包。下面這篇文章我會(huì)對(duì)Java 8的BASE64編解碼做一個(gè)詳細(xì)的介紹。
    2016-10-10
  • Java集合Iterator迭代的實(shí)現(xiàn)方法

    Java集合Iterator迭代的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java集合Iterator迭代接口的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒家,對(duì)Java 結(jié)合iterator知識(shí)感興趣的朋友一起看看吧
    2016-08-08
  • 教你在SpringBoot中管理多環(huán)境配置文件

    教你在SpringBoot中管理多環(huán)境配置文件

    在項(xiàng)目開發(fā)中,一般會(huì)分為開發(fā)環(huán)境,測(cè)試環(huán)境和生產(chǎn)環(huán)境.如果總是在一個(gè)文件中修修改改,難免會(huì)出現(xiàn)錯(cuò)誤,尤其是在交接的過程中,一旦出現(xiàn)問題,輕則丟失績(jī)效,重則需要?jiǎng)h庫跑路.本文則帶大家詳細(xì)了解怎么管理多環(huán)境配置文件,需要的朋友可以參考下
    2021-05-05
  • JAVA返回PDF文件流并進(jìn)行下載的實(shí)現(xiàn)方法

    JAVA返回PDF文件流并進(jìn)行下載的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于JAVA返回PDF文件流并進(jìn)行下載的實(shí)現(xiàn)方法,PDF文件流下載是通過HTTP協(xié)議將服務(wù)器上的PDF文件以流的方式發(fā)送給客戶端,供客戶端保存到本地磁盤或直接在瀏覽器中打開,需要的朋友可以參考下
    2024-02-02

最新評(píng)論