日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java垃圾回收机制(GC)

發(fā)布時(shí)間:2023/12/10 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java垃圾回收机制(GC) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

GC原理

對于GC來說,當(dāng)程序員創(chuàng)建對象時(shí),GC就開始監(jiān)控這個(gè)對象的地址、大小以及使用情況。

通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)GC確定一些對象為"不可達(dá)"時(shí),GC就有責(zé)任回收這些內(nèi)存空間。

優(yōu)點(diǎn):

  • 垃圾回收機(jī)制有效的防止了內(nèi)存泄露,可以有效的使用可使用的內(nèi)存。
  • 垃圾回收器通常作為一個(gè)單獨(dú)的低級別的線程運(yùn)行,在不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或很長時(shí)間沒有用過的對象進(jìn)行清除和回收。
  • 程序員不能實(shí)時(shí)的對某個(gè)對象或所有對象調(diào)用垃圾回收器進(jìn)行垃圾回收。

如何判斷哪些對象可以被GC回收

  • 引用計(jì)數(shù)器法:為每個(gè)對象創(chuàng)建一個(gè)引用計(jì)數(shù),有對象引用時(shí)計(jì)數(shù)器 +1,引用被釋放時(shí)計(jì)數(shù) -1,當(dāng)計(jì)數(shù)器為 0時(shí)就可以被回收。它有一個(gè)缺點(diǎn)不能解決循環(huán)引用的問題;
  • 可達(dá)性分析算法:從 GC Roots 開始向下搜索,搜索所走過的路徑稱為引用鏈。當(dāng)一個(gè)對象到 GC Roots 沒有任何引用鏈相連時(shí),則證明此對象是可以被回收的。

注意:

垃圾回收不會(huì)發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會(huì)觸發(fā)完全垃圾回收(Full GC)。如果你仔細(xì)查看垃圾收集器的輸出信息,就會(huì)發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。

java引用分析

  • 強(qiáng)引用:發(fā)生 gc 的時(shí)候不會(huì)被回收。
Object strongReference = new Object();
  • 軟引用:有用但并不是必需的對象,在對于軟引用關(guān)聯(lián)著的對象,只有在內(nèi)存不足的時(shí)候JVM才會(huì)回收該對象
     
    軟引用可以和一個(gè)引用隊(duì)列聯(lián)合使用,如果軟引用所引用的對象被JVM回收,這個(gè)軟引用就會(huì)被加入到與之關(guān)聯(lián)的引用隊(duì)列中
SoftReference<String> sr = new SoftReference<String>(new String("hello"));System.out.println(sr.get());
  • 弱引用:非必需對象的,當(dāng)JVM進(jìn)行垃圾回收時(shí),無論內(nèi)存是否充足,都會(huì)回收被弱引用關(guān)聯(lián)的對象
WeakReference<String> sr = new WeakReference<String>(new String("hello"));System.out.println(sr.get());System.gc(); //通知JVM的gc進(jìn)行垃圾回收System.out.println(sr.get());
  • 虛引用(幽靈引用/幻影引用):無法通過虛引用獲得對象,用 PhantomReference 實(shí)現(xiàn)虛引用,虛引用的用途是在 gc時(shí)返回一個(gè)通知。
ReferenceQueue<String> queue = new ReferenceQueue<String>();PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);System.out.println(pr.get());

參考資料:
https://blog.csdn.net/jiahao1186/article/details/81591861

總結(jié)

以上是生活随笔為你收集整理的Java垃圾回收机制(GC)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。