最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

Java語言的垃圾回收

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

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

答:在Java語言的生命周期中,Java運(yùn)行環(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虛擬機(jī)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垃圾回收機(jī)制的好處

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

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

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

例如:

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

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

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

在任何時候,程序員都不能通過程序強(qiáng)迫垃圾回收器立即執(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

程序可能到運(yùn)行結(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();
			// 下面兩行代碼的作用完全相同,強(qiáng)制系統(tǒng)進(jìn)行垃圾回收
			// System.gc();
			Runtime.getRuntime().gc();
	}
	public void finalize()
	{
		System.out.println("系統(tǒng)正在清理GcTest對象的資源...");
	}
}

總結(jié)

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

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

相關(guān)文章

  • 基于selenium 獲取新頁面元素失敗的解決方法

    基于selenium 獲取新頁面元素失敗的解決方法

    今天小編就為大家分享一篇基于selenium 獲取新頁面元素失敗的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • JavaScript的基本類型值-String類型

    JavaScript的基本類型值-String類型

    String類型用于表示由零或多個16位Unicode字符組成的字符序列,即字符串。在JavaScript中沒有單個的字符型,都是字符串。這篇文章主要介紹了JavaScript的基本類型值String類型,需要的朋友可以參考下
    2017-02-02
  • Spring security密碼加密實現(xiàn)代碼實例

    Spring security密碼加密實現(xiàn)代碼實例

    這篇文章主要介紹了Spring security密碼加密實現(xiàn)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Slf4j+logback實現(xiàn)JSON格式日志輸出方式

    Slf4j+logback實現(xiàn)JSON格式日志輸出方式

    這篇文章主要介紹了Slf4j+logback實現(xiàn)JSON格式日志輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring Boot如何實現(xiàn)定時任務(wù)的動態(tài)增刪啟停詳解

    Spring Boot如何實現(xiàn)定時任務(wù)的動態(tài)增刪啟停詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot如何實現(xiàn)定時任務(wù)的動態(tài)增刪啟停的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot?將配置文件掛到?jar?包外面的操作方法

    SpringBoot?將配置文件掛到?jar?包外面的操作方法

    在 SpringBoot 中,可以將配置文件放在 jar 包外面,這樣可以方便地修改配置而不需要重新打包和部署,這篇文章主要介紹了SpringBoot?如何將配置文件掛到?jar?包外面,需要的朋友可以參考下
    2023-03-03
  • Windows環(huán)境IDEA下Ranger1.2.0源碼編譯詳細(xì)流程

    Windows環(huán)境IDEA下Ranger1.2.0源碼編譯詳細(xì)流程

    本文給大家講解Windows環(huán)境IDEA下Ranger1.2.0源碼編譯過程,通過配置Tomcat,發(fā)布?security-admin-web項目,編譯啟動tomcat即可完成,需要的朋友參考下
    2021-06-06
  • Java中的synchronized鎖膨脹詳解

    Java中的synchronized鎖膨脹詳解

    這篇文章主要介紹了Java中的synchronized鎖膨脹詳解,正常創(chuàng)建的對象,狀態(tài)為無鎖,對象頭的Mark?Word?中主要記錄了?對象的年齡,也就是經(jīng)歷了多少次GC還存活下來,需要的朋友可以參考下
    2024-01-01
  • springboot接收別人上傳的本地視頻實例代碼

    springboot接收別人上傳的本地視頻實例代碼

    本文通過實例代碼給大家介紹了springboot接收別人上傳的本地視頻,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • 解決Java & Idea啟動tomcat的中文亂碼問題

    解決Java & Idea啟動tomcat的中文亂碼問題

    這篇文章主要介紹了Java & Idea啟動tomcat的中文亂碼問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論

杨浦区| 象山县| 昆山市| 金阳县| 林甸县| 民县| 平顶山市| 巴东县| 益阳市| 金寨县| 桐梓县| 井陉县| 普兰县| 蒙城县| 林口县| 丰宁| 上高县| 安化县| 大足县| 九江市| 宾阳县| 柯坪县| 邯郸市| 天津市| 奇台县| 东丽区| 江孜县| 越西县| 纳雍县| 蓬莱市| 边坝县| 浏阳市| 榆树市| 松溪县| 永吉县| 黎川县| 岳阳市| 平定县| 莱阳市| 察隅县| 黄龙县|