偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

面試官超級喜歡問的垃圾回收算法

開發(fā) 前端 算法
經(jīng)過前段時(shí)間一面的通過,阿巴阿巴被邀請進(jìn)入二面,這次她與遇到的面試官將繼續(xù)為難她,要問她關(guān)于GC算法的問題。 回家等通知

[[438235]]

本文轉(zhuǎn)載自微信公眾號「程序員巴士」,作者七十一 。轉(zhuǎn)載本文請聯(lián)系程序員巴士公眾號。

前言

經(jīng)過前段時(shí)間一面的通過,阿巴阿巴被邀請進(jìn)入二面,這次她與遇到的面試官將繼續(xù)為難她,要問她關(guān)于GC算法的問題。

回家等通知

面試官: 你對JVM的垃圾回收了解嗎?

阿巴阿巴: 嗯嗯,了解一些。

面試官: 那么JVM是如何判斷一個(gè)對象是垃圾呢?

阿巴阿巴: 好像有一個(gè)可達(dá)性分析法。

阿巴阿巴: 就是對象可達(dá)會(huì)判定為活對象,然后不可達(dá)的就當(dāng)作“垃圾”。

面試官: 嗯....講一下你了解的垃圾回收算法吧。

阿巴阿巴:

標(biāo)記清楚算法

標(biāo)記整理算法

復(fù)制算法

分代收集算法

面試官: 嗯....那你對這些算法了解嗎?

阿巴阿巴: 嗯....不太了解...

面試官: 行,今天先面到這里,你這邊先回去等通知吧??

阿巴阿巴: 好的。

很遺憾,您未能通過面試,您的簡歷已加入公司人才庫,期待下次相遇......

當(dāng)場拿Offer

面試官: 你對JVM的垃圾回收了解嗎?

阿巴阿巴: 嗯嗯,了解一些。

面試官: 那么JVM是如何判斷一個(gè)對象是垃圾呢?

阿巴阿巴: 有兩種方法,一種是引用計(jì)數(shù)法,另一種是可達(dá)性分析法。

阿巴阿巴: 引用計(jì)數(shù)法就是給對象一個(gè)引用計(jì)數(shù)器,每當(dāng)有引用引向該對象時(shí),引用計(jì)數(shù)器就加一,每當(dāng)有引用斷開的時(shí)候,引用計(jì)數(shù)器就減一,這樣當(dāng)引用計(jì)數(shù)器為零時(shí),那么就認(rèn)為這個(gè)對象已經(jīng)沒有用了,也就是所謂的“垃圾”,但是這種方式有個(gè)很大的弊端,對于循環(huán)引用無法處理。

阿巴阿巴: 循環(huán)引用的對象外部引用存在的情況,這種情況看似沒啥問題,但是當(dāng)我們把方法區(qū)的引用斷開時(shí),問題就暴露出來了。

阿巴阿巴: 循環(huán)引用的對象外部引用斷開的情況。

阿巴阿巴: 上面這種引用斷開的情況,顯然對象A和對象B已經(jīng)沒有外部引用來引用它們,它們已經(jīng)成為了垃圾,而引用計(jì)數(shù)器因?yàn)樗鼈兿嗷ヒ?循環(huán)引用),其值都為1,導(dǎo)致無法被回收,這個(gè)弊端導(dǎo)致引用計(jì)數(shù)法實(shí)際并沒有在JVM中所使用。

阿巴阿巴: 可達(dá)性分析法就是通過GC Roots的對象,以它為根往下搜索,這條被搜索的路徑稱為“引用鏈”,當(dāng)一個(gè)對象不被任何GC Roots的引用鏈所鏈接,那么就判定這個(gè)對象已經(jīng)“死了”,我們一般稱這個(gè)對象“不可達(dá)”。

面試官: 你剛有提到GC Roots,那你知道哪些對象可以作為GC Roots的對象嗎?

阿巴阿巴: 嗯嗯了解,主要有以下四類對象可以作為GC Roots的對象。

  • 虛擬機(jī)棧中引用的對象
  • 方法區(qū)中靜態(tài)屬性引用的對象
  • 方法區(qū)中常量引用的對象
  • 本地方法棧中引用的對象

阿巴阿巴: 下面這張圖可以直觀的看出它們的關(guān)系。

阿巴阿巴: 可以看出,只有被引用鏈鏈上的對象才能被判定為“存活”,而不在引用鏈上的對象則被判定為“死亡”,也將作為垃圾被回收。

面試官: 講的很不錯(cuò),那垃圾回收除了回收堆中的對象外,方法區(qū)中會(huì)有垃圾被回收嗎?

阿巴阿巴: 方法區(qū)中也是有垃圾回收的,方法區(qū)中主要回收廢棄了的常量和無用的類。

面試官: 嗯....講一下你了解的垃圾回收算法吧。

阿巴阿巴: 垃圾回收算法主要有以下四類。

  • 標(biāo)記清楚算法
  • 標(biāo)記整理算法
  • 復(fù)制算法
  • 分代收集算法

阿巴阿巴: 標(biāo)記清楚算法,是分為2個(gè)階段的,第一個(gè)階段進(jìn)行“標(biāo)記”,第二個(gè)階段進(jìn)行“清除”,先標(biāo)記出所有要清除的對象,也就是灰色部分,然后進(jìn)行回收。

阿巴阿巴: 采用標(biāo)記清除算法對堆進(jìn)行垃圾清理后,產(chǎn)生了很多空間碎片,這些空間碎片使新對象的內(nèi)存分配造成困難,不僅如此,標(biāo)記清除算法在標(biāo)記階段和清除階段的效率都不太高。

阿巴阿巴: 標(biāo)記整理算法孕育而生,解決了過多內(nèi)存碎片的問題。

阿巴阿巴: 為了解決效率的問題,復(fù)制算法也出現(xiàn)了,即把一塊內(nèi)存分成大小相等的2塊,每次使用的時(shí)候只使用其中的一塊,當(dāng)一塊內(nèi)存使用完的時(shí)候,把這塊內(nèi)存中存活的對象轉(zhuǎn)移到另一塊內(nèi)存中,然后將這塊內(nèi)存中的對象全部清空。

阿巴阿巴: 復(fù)制算法實(shí)現(xiàn)簡單、方便且效率很高,也不需要考慮內(nèi)存碎片的問題,但是要將內(nèi)存縮小為原來的一半,這代價(jià)無疑很高。

阿巴阿巴: 而且新生代的對象大多數(shù)都是朝生夕死的,按照1:1的空間比例來使用復(fù)制算法,將極大的影響了內(nèi)存的性能。

阿巴阿巴: 分代算法即將堆區(qū)進(jìn)行劃分,然后根據(jù)不同區(qū)域的情況來適用相應(yīng)的垃圾回收算法。

阿巴阿巴: 下圖是對新生代的細(xì)化,新生代分成Eden區(qū)和survivor區(qū),其中survivor區(qū)又分為(s0和s1)倆個(gè)區(qū)域,它們的比例如圖所示為8 : 1 : 1。新對象優(yōu)先會(huì)在Eden區(qū)進(jìn)行分配,標(biāo)記清除算法在這里不適用,因?yàn)樗槠?,如果沒有連續(xù)的足夠空間來分配給對象,又會(huì)繼續(xù)觸發(fā)垃圾回收,對性能影響比較大。

阿巴阿巴: 對于傳統(tǒng)的GC來說,都無法避免GC過程中帶來的“STOP-THE-WORLD”,我們一般簡稱STW,STW對系統(tǒng)性能的影響很大,那么如何消除STW或者減少STW的時(shí)間顯得尤為重要,其實(shí)分代算法并非是一種具體的算法,和前面的標(biāo)記清除、標(biāo)記整理算法、復(fù)制算法不同的是,分代算法只是對對堆得一個(gè)劃分,然后在不同區(qū)域使用不同的算法,從而將STW的時(shí)間細(xì)分到各個(gè)區(qū)域,使得STW時(shí)間不會(huì)持續(xù)很長一段時(shí)間,來達(dá)到提高系統(tǒng)性能的目的。

面試官: 講的很清楚細(xì)致了,很不錯(cuò),明天來上班吧??。

總結(jié)

關(guān)于垃圾回收算法這一塊,一定要答到GC Roots,以及各種垃圾回收算法,及他們的優(yōu)點(diǎn)和缺點(diǎn)。

 

責(zé)任編輯:武曉燕 來源: 程序員巴士
相關(guān)推薦

2021-11-08 09:18:01

CAS面試場景

2021-12-25 22:31:10

MarkWord面試synchronize

2021-12-16 18:38:13

面試Synchronize

2021-02-03 15:30:10

面試垃圾回收器前端

2020-12-10 08:43:17

垃圾回收JVM

2022-01-05 08:56:20

Vue修飾符面試

2024-03-25 11:03:38

Vue修飾符lazy

2020-02-03 17:22:34

垃圾回收原理種類

2023-08-02 08:48:11

C#碟片算法

2018-05-10 15:48:47

面試面試官Java

2024-07-26 08:47:07

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2025-06-03 07:05:00

Linux操作系統(tǒng)Windows

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-01-20 10:34:49

JVM垃圾回收算法

2020-07-28 00:58:20

IP地址子網(wǎng)TCP

2010-08-23 15:06:52

發(fā)問

2021-01-06 05:36:25

拉鏈表數(shù)倉數(shù)據(jù)

2021-05-11 21:56:11

算法清除JVM

2022-01-05 09:55:26

asynawait前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號