溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JVM運行時內(nèi)存的分代收集算法是什么

發(fā)布時間:2022-01-14 14:12:33 來源:億速云 閱讀:200 作者:小新 欄目:大數(shù)據(jù)

這篇文章給大家分享的是有關(guān)JVM運行時內(nèi)存的分代收集算法是什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

2.4.5. 分代收集算法

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

2.4.5.1. 新生代與復(fù)制算法

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

JVM運行時內(nèi)存的分代收集算法是什么

2.4.5.2. 老年代與標(biāo)記復(fù)制算法

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

1. JAVA 虛擬機提到過的處于方法區(qū)的永生代(Permanet Generation),它用來存儲 class 類,常量,方法描述等。對永生代的回收主要包括廢棄常量和無用的類。

2. 對象的內(nèi)存分配主要在新生代的 Eden Space 和 Survivor Space 的 From Space(Survivor 目前存放對象的那一塊),少數(shù)情況會直接分配到老生代。

3. 當(dāng)新生代的 Eden Space 和 From Space 空間不足時就會發(fā)生一次 GC,進行 GC 后,Eden Space 和 From Space 區(qū)的存活對象會被挪到 To Space,然后將 Eden Space 和 From Space 進行清理。

4. 如果 To Space 無法足夠存儲某個對象,則將這個對象存儲到老生代。

5. 在進行 GC 后,使用的便是 Eden Space 和 To Space 了,如此反復(fù)循環(huán)。

6. 當(dāng)對象在 Survivor 區(qū)躲過一次 GC 后,其年齡就會+1。默認(rèn)情況下年齡到達 15 的對象會被移到老生代中。

      2.5.JAVA 四中引用類型

2.5.1. 強引用

在 Java 中最常見的就是強引用,把一個對象賦給一個引用變量,這個引用變量就是一個強引

用。當(dāng)一個對象被強引用變量引用時,它處于可達狀態(tài),它是不可能被垃圾回收機制回收的,即

使該對象以后永遠都不會被用到 JVM 也不會回收。因此強引用是造成 Java 內(nèi)存泄漏的主要原因之

一。

2.5.2. 軟引用

軟引用需要用 SoftReference 類來實現(xiàn),對于只有軟引用的對象來說,當(dāng)系統(tǒng)內(nèi)存足夠時它

不會被回收,當(dāng)系統(tǒng)內(nèi)存空間不足時它會被回收。軟引用通常用在對內(nèi)存敏感的程序中。

2.5.3. 弱引用

弱引用需要用 WeakReference 類來實現(xiàn),它比軟引用的生存期更短,對于只有弱引用的對象

來說,只要垃圾回收機制一運行,不管 JVM 的內(nèi)存空間是否足夠,總會回收該對象占用的內(nèi)存。

2.5.4. 虛引用

虛引用需要 PhantomReference 類來實現(xiàn),它不能單獨使用,必須和引用隊列聯(lián)合使用。虛引用的主要作用是跟蹤對象被垃圾回收的狀態(tài)。

2.6.GC 分代收集算法

VS 分區(qū)收集算法

2.6.1. 分代收集算法

當(dāng)前主流 VM 垃圾收集都采用”分代收集”(Generational Collection)算法, 這種算法會根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊, 如 JVM 中的 新生代、老年代、永久代,這樣就可以根據(jù)各年代特點分別采用最適當(dāng)?shù)?GC 算法

2.6.1.1. 在新生代-復(fù)制算法

每次垃圾收集都能發(fā)現(xiàn)大批對象已死, 只有少量存活. 因此選用復(fù)制算法, 只需要付出少量存活對象的復(fù)制成本就可以完成收集.

2.6.1.2. 在老年代-標(biāo)記整理算法

因為對象存活率高、沒有額外空間對它進行分配擔(dān)保, 就必須采用“標(biāo)記—清理”或“標(biāo)記—整理”算法來進行回收, 不必進行內(nèi)存復(fù)制, 且直接騰出空閑內(nèi)存.

2.6.2. 分區(qū)收集算法

分區(qū)算法則將整個堆空間劃分為連續(xù)的不同小區(qū)間, 每個小區(qū)間獨立使用, 獨立回收. 這樣做的好處是可以控制一次回收多少個小區(qū)間 , 根據(jù)目標(biāo)停頓時間, 每次合理地回收若干個小區(qū)間(而不是整個堆), 從而減少一次 GC 所產(chǎn)生的停頓。

2.7.GC 垃圾收集器

Java 堆內(nèi)存被劃分為新生代和年老代兩部分,新生代主要使用復(fù)制和標(biāo)記-清除垃圾回收算法;年老代主要使用標(biāo)記-整理垃圾回收算法,因此 java 虛擬中針對新生代和年老代分別提供了多種不同的垃圾收集器,JDK1.6 中 Sun HotSpot 虛擬機的垃圾收集器如下

JVM運行時內(nèi)存的分代收集算法是什么

感謝各位的閱讀!關(guān)于“JVM運行時內(nèi)存的分代收集算法是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI