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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

GC策略解決了哪些問題?

  ?既然是要進行自動GC,那必然會有相應的策略,而這些策略解決了哪些問題呢,粗略的來說,主要有以下幾點。

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

? ? ? ? 2、何時回收這些對象。

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

GC策略采用何種算法?

  有關上面所提到的三個問題,其實最主要的一個問題就是第一個,也就是哪些對象才是可以回收的。

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

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);}}

  這段代碼看起來有點刻意為之,但其實在實際編程過程當中,是經常出現的,比如兩個一對一關系的數據庫對象,各自保持著對方的引用。最后一個無限循環只是為了保持JVM不退出,沒什么實際意義。  

  對于我們現在使用的GC來說,當thread線程運行結束后,會將objectA和objectB全部作為待回收的對象。而如果我們的GC采用上面所說的引用計數算法,則這兩個對象永遠不會被回收,即便我們在使用后顯示的將對象歸為空值也毫無作用。

? ? ? ?這里LZ大致解釋一下,在代碼中LZ標注了1、2、3三個數字,當第1個地方的語句執行完以后,兩個對象的引用計數全部為1。當第2個地方的語句執行完以后,兩個對象的引用計數就全部變成了2。當第3個地方的語句執行完以后,也就是將二者全部歸為空值以后,二者的引用計數仍然為1。根據引用計數算法的回收規則,引用計數沒有歸0的時候是不會被回收的。

根搜索算法

  由于引用計數算法的缺陷,所以JVM一般會采用一種新的算法,叫做根搜索算法。它的處理方式就是,設立若干種根對象,當任何一個根對象到某一個對象均不可達時,則認為這個對象是可以被回收的

?

  就拿上圖來說,ObjectD和ObjectE是互相關聯的,但是由于GC roots到這兩個對象不可達,所以最終D和E還是會被當做GC的對象,上圖若是采用引用計數法,則A-E五個對象都不會被回收。

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

? ? ? ? ?1、虛擬機棧中的引用的對象。

? ? ? ? ?2、方法區中的類靜態屬性引用的對象。

? ? ? ? ?3、方法區中的常量引用的對象。

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

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

垃圾搜集算法

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

? ? ? ?不過垃圾收集顯然還需要解決后兩個問題,什么時候回收以及如何回收。在根搜索算法的基礎上,現代虛擬機的實現當中,垃圾搜集的算法主要有三種,分別是標記-清除算法、復制算法、標記-整理算法。這三種算法都擴充了根搜索算法,不過它們理解起來還是非常好理解的。

轉載于:https://www.cnblogs.com/peterxiao/p/10669977.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。