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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM内存管理(一)--GC简介

發(fā)布時(shí)間:2023/12/2 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM内存管理(一)--GC简介 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

GC策略解決了哪些問題?

  ?既然是要進(jìn)行自動(dòng)GC,那必然會(huì)有相應(yīng)的策略,而這些策略解決了哪些問題呢,粗略的來說,主要有以下幾點(diǎn)。

? ? ? ? 1、哪些對象可以被回收。

? ? ? ? 2、何時(shí)回收這些對象。

? ? ? ? 3、采用什么樣的方式回收。

GC策略采用何種算法?

  有關(guān)上面所提到的三個(gè)問題,其實(shí)最主要的一個(gè)問題就是第一個(gè),也就是哪些對象才是可以回收的。

? ? ? ?有一種比較簡單直觀的辦法,它的效率較高,被稱作引用計(jì)數(shù)算法。但是這個(gè)算法有一個(gè)致命的缺陷,那就是對于循環(huán)引用的對象無法進(jìn)行回收。想象一下,假設(shè)JVM采用這種GC策略,那么程序猿在編寫的程序的時(shí)候,下面這樣的代碼就不要指望再出現(xiàn)了。

public class Object {Object field = null;public static void main(String[] args) {Thread thread = new Thread(new Runnable() {public void run() {Object objectA = new Object();Object objectB = new Object();//1objectA.field = objectB;objectB.field = objectA;//2//to do somethingobjectA = null;objectB = null;//3 }});thread.start();while (true);}}

  這段代碼看起來有點(diǎn)刻意為之,但其實(shí)在實(shí)際編程過程當(dāng)中,是經(jīng)常出現(xiàn)的,比如兩個(gè)一對一關(guān)系的數(shù)據(jù)庫對象,各自保持著對方的引用。最后一個(gè)無限循環(huán)只是為了保持JVM不退出,沒什么實(shí)際意義。  

  對于我們現(xiàn)在使用的GC來說,當(dāng)thread線程運(yùn)行結(jié)束后,會(huì)將objectA和objectB全部作為待回收的對象。而如果我們的GC采用上面所說的引用計(jì)數(shù)算法,則這兩個(gè)對象永遠(yuǎn)不會(huì)被回收,即便我們在使用后顯示的將對象歸為空值也毫無作用。

? ? ? ?這里L(fēng)Z大致解釋一下,在代碼中LZ標(biāo)注了1、2、3三個(gè)數(shù)字,當(dāng)?shù)?個(gè)地方的語句執(zhí)行完以后,兩個(gè)對象的引用計(jì)數(shù)全部為1。當(dāng)?shù)?個(gè)地方的語句執(zhí)行完以后,兩個(gè)對象的引用計(jì)數(shù)就全部變成了2。當(dāng)?shù)?個(gè)地方的語句執(zhí)行完以后,也就是將二者全部歸為空值以后,二者的引用計(jì)數(shù)仍然為1。根據(jù)引用計(jì)數(shù)算法的回收規(guī)則,引用計(jì)數(shù)沒有歸0的時(shí)候是不會(huì)被回收的。

根搜索算法

  由于引用計(jì)數(shù)算法的缺陷,所以JVM一般會(huì)采用一種新的算法,叫做根搜索算法。它的處理方式就是,設(shè)立若干種根對象,當(dāng)任何一個(gè)根對象到某一個(gè)對象均不可達(dá)時(shí),則認(rèn)為這個(gè)對象是可以被回收的。

?

  就拿上圖來說,ObjectD和ObjectE是互相關(guān)聯(lián)的,但是由于GC roots到這兩個(gè)對象不可達(dá),所以最終D和E還是會(huì)被當(dāng)做GC的對象,上圖若是采用引用計(jì)數(shù)法,則A-E五個(gè)對象都不會(huì)被回收。

  說到GC roots(GC根),在JAVA語言中,可以當(dāng)做GC roots的對象有以下幾種:

? ? ? ? ?1、虛擬機(jī)棧中的引用的對象。

? ? ? ? ?2、方法區(qū)中的類靜態(tài)屬性引用的對象。

? ? ? ? ?3、方法區(qū)中的常量引用的對象。

? ? ? ? ?4、本地方法棧中JNI的引用的對象。

? ? ? ?第一和第四種都是指的方法的本地變量表,第二種表達(dá)的意思比較清晰,第三種主要指的是聲明為final的常量值。

垃圾搜集算法

? ? ? ?根搜索算法解決的是垃圾搜集的基本問題,也就是上面提到的第一個(gè)問題,也是最關(guān)鍵的問題,就是哪些對象可以被回收。

? ? ? ?不過垃圾收集顯然還需要解決后兩個(gè)問題,什么時(shí)候回收以及如何回收。在根搜索算法的基礎(chǔ)上,現(xiàn)代虛擬機(jī)的實(shí)現(xiàn)當(dāng)中,垃圾搜集的算法主要有三種,分別是標(biāo)記-清除算法、復(fù)制算法、標(biāo)記-整理算法。這三種算法都擴(kuò)充了根搜索算法,不過它們理解起來還是非常好理解的。

轉(zhuǎn)載于:https://www.cnblogs.com/peterxiao/p/10669977.html

總結(jié)

以上是生活随笔為你收集整理的JVM内存管理(一)--GC简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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