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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

垃圾回收机制和JVM垃圾回收常见算法

發布時間:2025/3/12 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 垃圾回收机制和JVM垃圾回收常见算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

垃圾回收機制和JVM垃圾回收常見算法





垃圾回收的好處和特點:

好處:

1.?提高編程效率;

2.?垃圾回收機制保護程序的完整性。


特點:

1.?只能回收無用對象的內存空間,對其他物理資源無能為力;

2.?為了更快回收不再使用的對象,可以將對象的引用變量設置為null

3.?垃圾回收不可預知性(不同的垃圾回收機制和不同的垃圾回收算法)


垃圾回收的精確性主要體現在以下方面:

1.?垃圾回收機能夠精確的標記活著的對象(完全回收所以廢棄對象的前提)

2.?垃圾回收能夠精確的定位對象之間的引用關系(實現歸并和復制等算法的必要條件)



1. 標記——清除算法(Mark-Sweep)

標記——清除算法是第一種使用和比較完善的垃圾回收算法,算法分為兩個過程:

1、標記所有需要回收的對象

2、標記完成后清除被標記的對象。其標記的過程就是判斷對象有效性,執行可達性分析的過程。其執行流程圖大體如何下所示:?

同樣,我們也借助現實的場景進行描述。圖書管里有好多人在看書,圖書管理員想要收集起沒有被看的書的時候,他決定讓所有正在看書的人站起來,然后詢問每個人:那一本書是不看的。詢問完所有的人之后,同學們做下繼續看書。這時候,圖書管理員開始尋找所有做過標記的書,把它們收集起來。

缺點:?
1、每次進行垃圾回收時,會
暫停當前用戶程序的運行(類似讓所有的同學站起來)?
2、垃圾回收器需要間隔性的檢查,并且標記和清除的過程相對較慢。?
3、在標記清除之后可能會產生大量內存碎片,導致一旦需要為大對象分配空間時,由于找不到足夠大的內存空間,而不得以引發另外一次GC過程。


2. 標記——復制算法(Mark——Copy)

標記——復制存儲算法通過采用雙區域交替使用這種方式解決了標記——清除算法中效率低下的問題。它將可用內存劃分為兩個等量的區域(使用區和空閑區),每次只使用一塊。當正在使用的區域需要進行垃圾回收時,存活的對象將被復制到另外一塊區域。原先被使用的區域被重置,轉為空閑區。其執行流程大體如下所示:?
?
圖書管理員為了更好的發現不看的書,將圖書室一分為二(A區和B區),同一時刻只有一塊區域允許看書。開始時只允許在A區看書。當管理員想要回收A區不被看的書的時候,大喊一嗓子“正在看書的同學拿著你書到B區”。等所有人都到了B區后,圖書管理員只要把A區的書收集起來,就完成了任務。下一次收集的時候,則是要求同學帶著自己看的書從B區轉移到A區。如此循環往復即可。

缺點:?
1、
原有可用空間被縮小為1/2,空間利用率降低了。?
2、過程中也會暫停當前應用的運行。


3. 標記——整理算法(Mark——Compat)(相對標記--復制,少了一個保留區)

標記-復制算法在對象存活率較高的情況下就要進行較多的復制操作,更重要的是該算法浪費一半的內存空間,為了解決該問題,出現了標記——整理算法:其標記的過程和“標記-清除”算法一樣,而整理的過程則是讓所有存活的對象都向另外一端移動,然后直接清理掉端邊界以外的內存。其執行流程大體如下所示:?

缺點:?
1、
暫停當前應用的運行,非實時性的回收。


4. 分代收集算法

分代收集算法理論來源于統計學。IBM公司的專門研究發現,對象的生存周期總體可分為三種:新生代、老年代和永久代。因此可以根據各個年代的特點采用適當的垃圾回收算法。比如新生代的對象在每次垃圾時都會有大量的對象死去,只有很少一部分存活,那就可以選擇標記-復制算法。另外,在新生代中每次死亡對象約占98%,那么在標記-復制算法中就不需要按照1:1的比例來劃分內存區域,而是將新生代細分為了一塊較大的Eden和兩塊較小的Survivor區域,HotSpot中默認這兩塊區域的大小比例為8:2。每次新生代可用區域為Eden加上其中一塊Survivor區域,共90%的內存空間,這樣就只有10%的內存空間處在被閑置狀態。在進行垃圾回收時,存活的對象被轉移到原本處在“空閑的”Eden區域。如果某次垃圾回收后,存活對象所占空間遠大于這10%的內存空間時,也就是Survivor空間不夠用時,需要額外的空間來擔保,通常是將這些對象轉移到老年代對于老年代來說,大部分對象都處在存活狀態。同時,如果一個大對象要在該區域進行分配,而內存空間又不足,那么在沒有外部內存空間擔保的情況下,就必須選用標記-清除或者標記-整理算法來進行垃圾回收了。

總而言之,分代收集只是根據對象生存周期的不同來選擇不同的算法,其本身并沒有任何新思想。


5. 增量收集算法

以上所述的算法,都存在一個缺點:在進行垃圾回首時需要暫停當前應用的執行,也就是這時候的垃圾回收線程不能和應用線程同時運行。如果我們想做到“在不打斷同學們看書的情況下,圖書管理員就可以收集沒有被看的書”,這也是增量收集算法的目標,即在不中斷應用線程的狀態下垃圾回收線程也能進行垃圾回收。但是這里需要面對的問題是:垃圾回收線程在標記階段標記好了,還沒來的及清除時,當前應用線程進行內存操作,以至于清除階段無法正確開展,類似的情況是:圖書管理員剛標記了《JAVA核心技術》這本書已經沒有人看了,等標記完后,卻發現這本書已經有人在看了。


參考博文:https://blog.csdn.net/dd864140130/article/details/50084471

總結

以上是生活随笔為你收集整理的垃圾回收机制和JVM垃圾回收常见算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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