Java詳細(xì)分析梳理垃圾回收機制
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黑名單的完整步驟
這篇文章主要給大家介紹了關(guān)于Spring boot攔截器實現(xiàn)IP黑名單的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring boot攔截器具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06SpringTask實現(xiàn)定時任務(wù)方法講解
通過重寫Schedu lingConfigurer方法實現(xiàn)對定時任務(wù)的操作,單次執(zhí)行、停止、啟動三個主要的基本功能,動態(tài)的從數(shù)據(jù)庫中獲取配置的定時任務(wù)cron信息,通過反射的方式靈活定位到具體的類與方法中2023-02-02Hibernate連接三種數(shù)據(jù)庫的配置文件
今天小編就為大家分享一篇關(guān)于Hibernate連接三種數(shù)據(jù)庫的配置文件,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03RocketMQ生產(chǎn)者一個應(yīng)用不能發(fā)送多個NameServer消息解決
這篇文章主要為大家介紹了RocketMQ生產(chǎn)者一個應(yīng)用不能發(fā)送多個NameServer消息原因及解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11JAVA返回PDF文件流并進(jìn)行下載的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于JAVA返回PDF文件流并進(jìn)行下載的實現(xiàn)方法,PDF文件流下載是通過HTTP協(xié)議將服務(wù)器上的PDF文件以流的方式發(fā)送給客戶端,供客戶端保存到本地磁盤或直接在瀏覽器中打開,需要的朋友可以參考下2024-02-02