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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JVM—垃圾回收与算法

發(fā)布時間:2024/4/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM—垃圾回收与算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、如何確定垃圾

1、引用計數(shù)法

2、可達性分析

二、標記清除算法(Mark-Sweep)

三、復制算法(copying)

四、標記整理算法(Mark-Compact)

五、分代收集算法

1、新生代與復制算法

2、老年代與標記整理算法


一、如何確定垃圾

1、引用計數(shù)法

在?Java?中,引用和對象是有關(guān)聯(lián)的。如果要操作對象則必須用引用進行。因此,很顯然一個簡單的辦法是通過引用計數(shù)來判斷一個對象是否可以回收。簡單說,即一個對象如果沒有任何與之關(guān)聯(lián)的引用,即他們的引用計數(shù)都不為0,則說明對象不太可能再被用到,那么這個對象就是可回收對象。

2、可達性分析

為了解決引用計數(shù)法的循環(huán)引用問題,Java?使用了可達性分析的方法。通過一系列的“GC roots”對象作為起點搜索。如果在“GC roots”和一個對象之間沒有可達路徑,則稱該對象是不可達的。要注意的是,不可達對象不等價于可回收對象,不可達對象變?yōu)榭苫厥諏ο笾辽僖?jīng)過兩次標記過程。兩次標記后仍然是可回收對象,則將面臨回收。

二、標記清除算法(Mark-Sweep)

最基礎(chǔ)的垃圾回收算法,分為兩個階段,標注和清除。標記階段標記出所有需要回收的對象,清除階段回收被標記的對象所占用的空間。如圖

從圖中我們就可以發(fā)現(xiàn),該算法最大的問題是內(nèi)存碎片化嚴重,后續(xù)可能發(fā)生大對象不能找到可利用空間的問題。

三、復制算法(copying)

為了解決?Mark-Sweep?算法內(nèi)存碎片化的缺陷而被提出的算法。按內(nèi)存容量將內(nèi)存劃分為等大小的兩塊。每次只使用其中一塊,當這一塊內(nèi)存滿后將尚存活的對象復制到另一塊上去,把已使用的內(nèi)存清掉,如圖:

?這種算法雖然實現(xiàn)簡單,內(nèi)存效率高,不易產(chǎn)生碎片,但是最大的問題是可用內(nèi)存被壓縮到了原本的一半。且存活對象增多的話,Copying算法的效率會大大降低。

四、標記整理算法(Mark-Compact)

結(jié)合了以上兩個算法,為了避免缺陷而提出。標記階段和Mark-Sweep算法相同,標記后不是清理對象,而是將存活對象移向內(nèi)存的一端。然后清楚端邊界外的對象。如圖:

五、分代收集算法

分代收集法是目前大部分?JVM?所采用的方法,其核心思想是根據(jù)對象存活的不同生命周期將內(nèi)存劃分為不同的域,一般情況下將?GC?堆劃分為老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特點是每次垃圾回收時只有少量對象需要被回收,新生代的特點是每次垃圾回收時都有大量垃圾需要被回收,因此可以根據(jù)不同區(qū)域選擇不同的算法。

1、新生代與復制算法

目前大部分?JVM?的?GC?對于新生代都采取?Copying?算法,因為新生代中每次垃圾回收都要回收大部分對象,即要復制的操作比較少,但通常并不是按照?1:1?來劃分新生代。一般將新生代劃分為一塊較大的?Eden?空間和兩個較小的?Survivor?空間(From Space, To Space),每次使用Eden?空間和其中的一塊?Survivor?空間,當進行回收時,將該兩塊空間中還存活的對象復制到另 一塊?Survivor?空間中。

?

2、老年代與標記整理算法

而老年代因為每次只回收少量對象,因而采用?Mark-Compact?算法。

  • JAVA?虛擬機提到過的處于方法區(qū)的永生代(Permanet Generation),它用來存儲?class?類、常量、方法描述等。對永生代的回收主要包括廢棄常量和無用的類。
  • 對象的內(nèi)存分配主要在新生代的?Eden Space?和?Survivor Space?的?From Space(Survivor?目前存放對象的那一塊),少數(shù)情況會直接分配到老生代。
  • 當新生代的?Eden Space?和?From Space?空間不足時就會發(fā)生一次?GC,進行?GC?后,Eden Space?和?From Space?區(qū)的存活對象會被挪到?To Space,然后將?Eden Space?和?From Space?進行清理。
  • 如果?To Space?無法足夠存儲某個對象,則將這個對象存儲到老生代。
  • 在進行?GC?后,使用的便是?Eden Space?和?To Space?了,如此反復循環(huán)。
  • 當對象在?Survivor?區(qū)躲過一次?GC?后,其年齡就會+1。默認情況下年齡到達?15?的對象會被移到老生代中。??
  • ?

    總結(jié)

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

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