上篇文章介紹了jvm運行時候?qū)ο筮M(jìn)入老年代的場景,以及如何避免頻繁fullGC。
Jvm參數(shù)設(shè)置-JVM(八)
- 老年代分配擔(dān)保機(jī)制
這個機(jī)制的目的是為了提升效率,在minorGC之前,會有三次判斷,之后再次minorGC速度會很快。
- 老年代剩余空間是否 大于 年輕代里現(xiàn)在所有對象
大于的話則直接minorGC
- 如果不大于則看看參數(shù)是否配置:-XX:-HandlerPromotionFailure
沒有配置則直接fullGC
- 配置了則看看 老年代剩余可用空間是否 大于 每次minorGC后進(jìn)入老年代的平均值
大于的話直接minorGC,否則直接fullGC
FullGC之后最后還是會minorGC。
- 對象內(nèi)存回收
- 引用計數(shù)器
這個方法簡單效率高,但目前主流虛擬機(jī)沒有用表格這個算法,主要不能解決循環(huán)引用問題。因為兩者相互引用,導(dǎo)致他們引用計數(shù)器不為0,而引用計數(shù)器必須是為0才會回收。
?
- 可達(dá)性分析算法
將GC roots對象作為節(jié)點,向下搜索,找到對象都標(biāo)記為 非垃圾對象,其余未標(biāo)記的都是 垃圾對象。
GC roots根節(jié)點,:線程棧本地變量,靜態(tài)變量,本地方法棧變量等。
- 常見引用類型
引用類型:強引用,軟引用,弱引用,虛引用
- 強引用:User user = new User();
- 軟引用:用SoftReference軟引用類型包裹對象, 正常不會被回收,但GC做完釋放不出空間放新對象,則會回收。軟引用可以作用在內(nèi)存敏感的高速緩存。
SoftReference<User> user = new SoftReference<User>(new User());
軟引用在實際場景很重要,例如瀏覽器后退按鈕,這個后退是重新加載還是從緩存里取,這要看實際應(yīng)用場景。
- 如果一個瀏覽器進(jìn)入新頁面就內(nèi)容回收,則需要重新加載。
- 如果瀏覽頁面內(nèi)存很大,放在內(nèi)存會內(nèi)存溢出。
- 弱引用GC每次會直接回收。
WeakReference<User> user = new WeakReference<User>(new User());
- 虛引用也成為幽靈引用,幾乎不用。
- finalize()方法最終判斷對象是否存活
當(dāng)對象背回收之前,會判斷這個對象是否覆蓋了finalize方法,如果覆蓋了,在回收之前則會執(zhí)行這個方法,不回收則不執(zhí)行。
既然在回收之前會執(zhí)行,那么自然可以自救,可以把當(dāng)前對象放入靜態(tài)list集合保證在使用則不會被收回。(不推薦使用)
- 如何判斷一個類是無用的類
方法區(qū)如果發(fā)生回收的條件,必須這個類是無用的類:
- 該類所有對象實例都被回收,也就是java堆中不存在該類任何實例。
- 加載該類的ClassLoader已經(jīng)被回收。(CLassLoader回收條件很苛刻)
前面說過引導(dǎo)類(核心包)BootStrapClassLoader,擴(kuò)展ClassLoader以及appClassLoader應(yīng)用程序的classLoader,這些不會被回收。文章來源:http://www.zghlxwxcb.cn/news/detail-544676.html
但是jsp的加載器,每個jsp都對應(yīng)一個新的加載器,這種加載器就很容易被回收。(一般自定義的才會回收)文章來源地址http://www.zghlxwxcb.cn/news/detail-544676.html
- 該類的java.lang.Class對象沒有地方被引用,無法在任何地方通過反射訪問該類信息。
到了這里,關(guān)于Jvm對象回收算法-JVM(九)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!