天天看點

Java面試題-jvm6

作者:Java農夫

又是一年招聘季,整理一些面試題,為自己也為大家整理點資料,希望大家成功上岸。這些整理的是針對面試。因平台單日有釋出數量限制,超出限制的隻能粉絲檢視,需要的請關注後自行擷取,謝謝。

垃圾收集算法

已經能夠确定一個對象為垃圾之後,接下來要考慮的就是回收,怎麼回收呢?得要有對應的算法,下面介紹常見的垃圾回收算法。高效 健壯

标記-清除(Mark-Sweep)

  • 标記:找出記憶體中需要回收的對象,并且把它們标記出來

此時堆中所有的對象都會被掃描一遍,進而才能确定需要回收的對象,比較耗時

Java面試題-jvm6
  • 清除:清除掉被标記需要回收的對象,釋放出對應的記憶體空間
Java面試題-jvm6

缺點

标記清除之後會産生大量不連續的記憶體碎片,空間碎片太多可能會導緻以後在程

序運作過程中需要配置設定較大對象時,無法找到足夠的連續記憶體而不得不提前觸發另一次垃圾收集動作。

(1)标記和清除兩個過程都比較耗時,效率不高

(2)會産生大量不連續的記憶體碎片,空間碎片太多可能會導緻以後在程式運作過程中需要配置設定較大對象時,無法找到足夠的連續記憶體而不得不提前觸發另一次垃圾收集動作。

标記-複制(Mark-Copying)

将記憶體劃分為兩塊相等的區域,每次隻使用其中一塊,如下圖所示:

Java面試題-jvm6

當其中一塊記憶體使用完了,就将還存活的對象複制到另外一塊上面,然後把已經使用過的記憶體空間一次清除掉。

Java面試題-jvm6

缺點:空間使用率降低。

标記-整理(Mark-Compact)

複制收集算法在對象存活率較高時就要進行較多的複制操作,效率将會變低。更關鍵的是,如果不想浪費50%的空間,就需要有額外的空間進行配置設定擔保,以應對被使用的記憶體中所有對象都有100%存活的極端情況,是以老年代一般不能直接選用這種算法。

标記過程仍然與"标記-清除"算法一樣,但是後續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然後直接清理掉端邊界以外的記憶體。

其實上述過程相對"複制算法"來講,少了一個"保留區"

Java面試題-jvm6

讓所有存活的對象都向一端移動,清理掉邊界以外的記憶體。

Java面試題-jvm6

分代收集算法

既然上面介紹了3種垃圾收集算法,那麼在堆記憶體中到底用哪一個呢?

  • Young區:複制算法(對象在被配置設定之後,可能生命周期比較短,Young區複制效率比較高)
  • Old區:标記清除或标記整理(Old區對象存活時間比較長,複制來複制去沒必要,不如做個标記再清理)

繼續閱讀