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

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

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

Java語言的垃圾回收

1.垃圾回收機制的基本概念

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

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

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

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

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

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

問:4.那么,Java是如何知道一個對象沒有用的呢?

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

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

實例代碼段:

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

思路:

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

當(dāng)然除了引用計數(shù)法判斷對象是否存活,還有很多的算法去判斷。例如可達(dá)性算法。雖然引用計數(shù)法原理簡單,判斷效率高但是同樣存在很多的缺陷。例如對象的循環(huán)引用時計數(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相互引用對方,導(dǎo)致它們引用計數(shù)不為0,但是實際已是無用對象,但是無法被識別。

2.Java垃圾回收機制的好處

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

3.Java垃圾回收機制的特點

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

例如:

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

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

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

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

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

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

形式:

protected void finalize() throws Throwable

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

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

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

代碼示例:

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

總結(jié)

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

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

相關(guān)文章

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

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

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

    簡單了解如何在spring中使用RabbitMQ

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

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

    通過重寫Schedu lingConfigurer方法實現(xiàn)對定時任務(wù)的操作,單次執(zhí)行、停止、啟動三個主要的基本功能,動態(tài)的從數(shù)據(jù)庫中獲取配置的定時任務(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)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • RocketMQ生產(chǎn)者一個應(yīng)用不能發(fā)送多個NameServer消息解決

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

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

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

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

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

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

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

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

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

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

最新評論