国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java八股文面試[JVM]——垃圾回收

這篇具有很好參考價值的文章主要介紹了java八股文面試[JVM]——垃圾回收。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

參考:JVM學(xué)習(xí)筆記(一)_卷心菜不卷Iris的博客-CSDN博客

GC垃圾回收
面試題:

JVM內(nèi)存模型以及分區(qū),需要詳細(xì)到每個區(qū)放什么
堆里面的分區(qū):Eden,survival from to,老年代,各自的特點。


GC的三種收集方法:標(biāo)記清除、標(biāo)記整理、復(fù)制算法的原理與特點,分別用在什么地方

針對RockitMQ 消息中間件的服務(wù)器,應(yīng)該使用什么樣的GC算法?(TODO


Minor GC與Full GC分別在什么時候發(fā)生

GC發(fā)生的區(qū)域:方法區(qū) 和 堆

java八股文面試[JVM]——垃圾回收,java八股文,java,面試,jvm

?
JVM垃圾判定算法:(對象已死?)

引用計數(shù)法(Reference-Counting)
可達(dá)性分析算法(根搜索算法)

垃圾判定
4.2.1. 引用計數(shù)法(Reference-Counting)
引用計數(shù)算法是通過判斷對象的引用數(shù)量來決定對象是否可以被回收。

給對象中添加一個引用計數(shù)器,每當(dāng)有一個地方引用它時,計數(shù)器值就加1;當(dāng)引用失效時,計數(shù)器值就減1;任何時刻計數(shù)器為0的對象就是不可能再被使用的。

優(yōu)點:

簡單,高效,現(xiàn)在的objective-c、python等用的就是這種算法。
缺點:

引用和去引用伴隨著加減算法,影響性能

很難處理循環(huán)引用,相互引用的兩個對象則無法釋放。

因此目前主流的Java虛擬機都摒棄掉了這種算法。
?

可達(dá)性分析算法

這個算法的基本思想就是通過一系列的稱為?“GC Roots”?的對象作為起點,從這些節(jié)點開始向下搜索,節(jié)點所走過的路徑稱為引用鏈,當(dāng)一個對象到 GC Roots 沒有任何引用鏈相連的話,則證明此對象是不可用的。

java八股文面試[JVM]——垃圾回收,java八股文,java,面試,jvm

在Java語言中,可以作為GC Roots的對象包括下面幾種:

虛擬機棧(棧幀中的本地變量表)中的引用對象。
方法區(qū)中的類靜態(tài)屬性引用的對象。
方法區(qū)中的常量引用的對象。
本地方法棧中JNI(Native方法)的引用對象
真正標(biāo)記以為對象為可回收狀態(tài)至少要標(biāo)記兩次。

第一次標(biāo)記:不在 GC Roots 鏈中,標(biāo)記為可回收對象。

第二次標(biāo)記:判斷當(dāng)前對象是否實現(xiàn)了finalize() 方法,如果沒有實現(xiàn)則直接判定這個對象可以回收,如果實現(xiàn)了就會先放入一個隊列中。并由虛擬機建立一個低優(yōu)先級的程序去執(zhí)行它,隨后就會進(jìn)行第二次小規(guī)模標(biāo)記,在這次被標(biāo)記的對象就會真正被回收了!
java八股文面試[JVM]——垃圾回收,java八股文,java,面試,jvm

四種引用
平時只會用到強引用軟引用。

強引用:

? 類似于 Object obj = new Object(); 只要強引用還存在,垃圾收集器永遠(yuǎn)不會回收掉被引用的對象。

軟引用:

? SoftReference 類實現(xiàn)軟引用。在系統(tǒng)要發(fā)生內(nèi)存溢出異常之前,才會將這些對象列進(jìn)回收范圍之中進(jìn)行二次回收。如果這次回收還沒有足夠的內(nèi)存,才會拋出內(nèi)存溢出異常。軟引用可用來實現(xiàn)內(nèi)存敏感的高速緩存。

弱引用:

? WeakReference 類實現(xiàn)弱引用。對象只能生存到下一次垃圾收集之前。在垃圾收集器工作時,無論內(nèi)存是否足夠都會回收掉只被弱引用關(guān)聯(lián)的對象。

虛引用:

? PhantomReference 類實現(xiàn)虛引用。無法通過虛引用獲取一個對象的實例,為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個對象被收集器回收時收到一個系統(tǒng)通知。

作用:

虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用軟引用和弱引用的一個區(qū)別在于:虛引用必須和引用隊列 (ReferenceQueue)聯(lián)合使用。當(dāng)垃圾回收器準(zhǔn)備回收一個對象時,如果發(fā)現(xiàn)它還有虛引用,就會在回收對象的內(nèi)存之前,把這個虛引用加入到與之 關(guān)聯(lián)的引用隊列中。你聲明虛引用的時候是要傳入一個queue的。當(dāng)你的虛引用所引用的對象已經(jīng)執(zhí)行完finalize函數(shù)的時候,就會把對象加到queue里面。你可以通過判斷queue里面是不是有對象來判斷你的對象是不是要被回收了

?
GC垃圾回收主要有四大算法:(怎么找到已死對象并清除?)

復(fù)制算法(Copying)
標(biāo)記清除(Mark-Sweep)
標(biāo)記壓縮(Mark-Compact),又稱標(biāo)記整理
分代收集算法(Generational-Collection)

GC的特點

  • 次數(shù)上頻繁收集Young區(qū)
  • 次數(shù)上較少收集Old區(qū)
  • 基本不動Perm區(qū)
垃圾回收算法
在介紹JVM垃圾回收算法前,先介紹一個概念:Stop-the-World

Stop-the-world意味著 JVM由于要執(zhí)行GC而停止了應(yīng)用程序的執(zhí)行,并且這種情形會在任何一種GC算法中發(fā)生。當(dāng)Stop-the-world發(fā)生時,除了GC所需的線程以外,所有線程都處于等待狀態(tài)直到GC任務(wù)完成。事實上,GC優(yōu)化很多時候就是指減少Stop-the-world發(fā)生的時間,從而使系統(tǒng)具有高吞吐 、低停頓的特點。

1. 復(fù)制算法(Copying)
該算法將內(nèi)存平均分成兩部分,然后每次只使用其中的一部分,當(dāng)這部分內(nèi)存滿的時候,將內(nèi)存中所有存活的對象復(fù)制到另一個內(nèi)存中,然后將之前的內(nèi)存清空,只使用這部分內(nèi)存,循環(huán)下去。
java八股文面試[JVM]——垃圾回收,java八股文,java,面試,jvm

優(yōu)點:

實現(xiàn)簡單
不產(chǎn)生內(nèi)存碎片
缺點:

將內(nèi)存縮小為原來的一半,浪費了一半的內(nèi)存空間,代價太高;如果不想浪費一半的空間,就需要有額外的空間進(jìn)行分配擔(dān)保,以應(yīng)對被使用的內(nèi)存中所有對象都100%存活的極端情況,所以在老年代一般不能直接選用這種算法。

如果對象的存活率很高,我們可以極端一點,假設(shè)是100%存活,那么我們需要將所有對象都復(fù)制一遍,并將所有引用地址重置一遍。復(fù)制這一工作所花費的時間,在對象存活率達(dá)到一定程度時,將會變的不可忽視。 所以從以上描述不難看出,復(fù)制算法要想使用,最起碼對象的存活率要非常低才行,而且最重要的是,我們必須要克服50%內(nèi)存的浪費。

年輕代中使用的是Minor GC,這種GC算法采用的是復(fù)制算法(Copying)。

? HotSpot JVM把年輕代分為了三部分:1個Eden區(qū)和2個Survivor區(qū)(分別叫from和to)。默認(rèn)比例為8:1:1,一般情況下,新創(chuàng)建的對象都會被分配到Eden區(qū)。因為年輕代中的對象基本都是朝生夕死的(90%以上),所以在年輕代的垃圾回收算法使用的是復(fù)制算法。

? 在GC開始的時候,對象只會存在于Eden區(qū)和名為“From”的Survivor區(qū),Survivor區(qū)“To”是空的。緊接著進(jìn)行GC,Eden區(qū)中所有存活的對象都會被復(fù)制到“To”,而在“From”區(qū)中,仍存活的對象會根據(jù)他們的年齡值來決定去向。對象在Survivor區(qū)中每熬過一次Minor GC,年齡就會增加1歲。年齡達(dá)到一定值(年齡閾值,可以通過-XX:MaxTenuringThreshold來設(shè)置)的對象會被移動到年老代中,沒有達(dá)到閾值的對象會被復(fù)制到“To”區(qū)域。經(jīng)過這次GC后,Eden區(qū)和From區(qū)已經(jīng)被清空。這個時候,“From”和“To”會交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎樣,都會保證名為To的Survivor區(qū)域是空的。Minor GC會一直重復(fù)這樣的過程,直到“To”區(qū)被填滿,“To”區(qū)被填滿之后,會將所有對象移動到年老代中。

java八股文面試[JVM]——垃圾回收,java八股文,java,面試,jvm

?文章來源地址http://www.zghlxwxcb.cn/news/detail-669085.html

因為Eden區(qū)對象一般存活率較低,一般的,使用兩塊10%的內(nèi)存作為空閑和活動區(qū)間,而另外80%的內(nèi)存,則是用來給新建對象分配內(nèi)存的。一旦發(fā)生GC,將10%的from活動區(qū)間與另外80%中存活的eden對象轉(zhuǎn)移到10%的to空閑區(qū)間,接下來,將之前90%的內(nèi)存全部釋放,以此類推。

2.標(biāo)記清除(Mark-Sweep)
“標(biāo)記-清除”(Mark Sweep)算法是幾種GC算法中最基礎(chǔ)的算法,是因為后續(xù)的收集算法都是基于這種思路并對其不足進(jìn)行改進(jìn)而得到的。正如名字一樣,算法分為2個階段:

標(biāo)記出需要回收的對象,使用的標(biāo)記算法均為可達(dá)性分析算法。

回收被標(biāo)記的對象。

java八股文面試[JVM]——垃圾回收,java八股文,java,面試,jvm

缺點:

  • 效率問題(兩次遍歷)

  • 空間問題(標(biāo)記清除后會產(chǎn)生大量不連續(xù)的碎片。JVM就不得不維持一個內(nèi)存的空閑列表,這又是一種開銷。而且在分配數(shù)組對象的時候,尋找連續(xù)的內(nèi)存空間會不太好找。)

3. 標(biāo)記壓縮(Mark-Compact)

標(biāo)記-整理法是標(biāo)記-清除法的一個改進(jìn)版。同樣,在標(biāo)記階段,該算法也將所有對象標(biāo)記為存活和死亡兩種狀態(tài);不同的是,在第二個階段,該算法并沒有直接對死亡的對象進(jìn)行清理,而是通過所有存活對像都向一端移動,然后直接清除邊界以外的內(nèi)存。

java八股文面試[JVM]——垃圾回收,java八股文,java,面試,jvm

優(yōu)點:

? 標(biāo)記/整理算法不僅可以彌補標(biāo)記/清除算法當(dāng)中,內(nèi)存區(qū)域分散的缺點,也消除了復(fù)制算法當(dāng)中,內(nèi)存減半的高額代價。

缺點:

? 如果存活的對象過多,整理階段將會執(zhí)行較多復(fù)制操作,導(dǎo)致算法效率降低。

老年代一般是由標(biāo)記清除或者是標(biāo)記清除與標(biāo)記整理的混合實現(xiàn)。

?java八股文面試[JVM]——垃圾回收,java八股文,java,面試,jvm

4. 分代收集算法(Generational-Collection)

內(nèi)存效率:復(fù)制算法>標(biāo)記清除算法>標(biāo)記整理算法(此處的效率只是簡單的對比時間復(fù)雜度,實際情況不一定如此)。
內(nèi)存整齊度:復(fù)制算法=標(biāo)記整理算法>標(biāo)記清除算法。
內(nèi)存利用率:標(biāo)記整理算法=標(biāo)記清除算法>復(fù)制算法。

可以看出,效率上來說,復(fù)制算法是當(dāng)之無愧的老大,但是卻浪費了太多內(nèi)存,而為了盡量兼顧上面所提到的三個指標(biāo),標(biāo)記/整理算法相對來說更平滑一些,但效率上依然不盡如人意,它比復(fù)制算法多了一個標(biāo)記的階段,又比標(biāo)記/清除多了一個整理內(nèi)存的過程

難道就沒有一種最優(yōu)算法嗎?

回答:無,沒有最好的算法,只有最合適的算法。==========>分代收集算法。

分代回收算法實際上是把復(fù)制算法和標(biāo)記整理法的結(jié)合,并不是真正一個新的算法,一般分為:老年代(Old Generation)和新生代(Young Generation),老年代就是很少垃圾需要進(jìn)行回收的,新生代就是有很多的內(nèi)存空間需要回收,所以不同代就采用不同的回收算法,以此來達(dá)到高效的回收算法。

年輕代(Young Gen)

? 年輕代特點是區(qū)域相對老年代較小,對像存活率低。

? 這種情況復(fù)制算法的回收整理,速度是最快的。復(fù)制算法的效率只和當(dāng)前存活對像大小有關(guān),因而很適用于年輕代的回收。而復(fù)制算法內(nèi)存利用率不高的問題,通過hotspot中的兩個survivor的設(shè)計得到緩解。

老年代(Tenure Gen)

? 老年代的特點是區(qū)域較大,對像存活率高。

? 這種情況,存在大量存活率高的對像,復(fù)制算法明顯變得不合適。一般是由標(biāo)記清除或者是標(biāo)記清除與標(biāo)記整理的混合實現(xiàn)。
?

?

到了這里,關(guān)于java八股文面試[JVM]——垃圾回收的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • java八股文面試[JVM]——雙親委派模型

    java八股文面試[JVM]——雙親委派模型

    1.當(dāng) AppClassLoader 去加載一個class時,它首先不會自己去嘗試加載這個類,而是把類加載請求委托給父加載器 ExtClassLoader 去完成。 2.當(dāng)ExtClassLoader去加載一個class時,它首先也不會去嘗試加載這個類,而是把類加載請求委托給父加載器 BootstrapClassLoader 去完成。 3.如果BootstrapClas

    2024年02月11日
    瀏覽(35)
  • java面試八股文_虛擬機篇(jvm)

    java面試八股文_虛擬機篇(jvm)

    要求 掌握 JVM 內(nèi)存結(jié)構(gòu)劃分 尤其要知道方法區(qū)、永久代、元空間的關(guān)系 結(jié)合一段 java 代碼的執(zhí)行理解內(nèi)存劃分 執(zhí)行 javac 命令編譯 源代碼(java Source) 為 字節(jié)碼 執(zhí)行 java 命令 創(chuàng)建 JVM,調(diào)用類加載子系統(tǒng)加載 class,將類的信息存入 方法區(qū) 創(chuàng)建 main 線程,使用的內(nèi)存區(qū)域是 J

    2023年04月08日
    瀏覽(15)
  • 一天吃透JVM面試八股文

    JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。由 一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域等 組成。JVM屏蔽了與操作系統(tǒng)平臺相關(guān)的信息,使得Java程序只需要生成在Java虛擬機上運行的

    2023年04月19日
    瀏覽(30)
  • 【java八股文】之JVM基礎(chǔ)篇

    【java八股文】之JVM基礎(chǔ)篇

    【java八股文】之JVM基礎(chǔ)篇-CSDN博客 【java八股文】之MYSQL基礎(chǔ)篇-CSDN博客 【java八股文】之Redis基礎(chǔ)篇-CSDN博客 【java八股文】之Spring系列篇-CSDN博客 【java八股文】之分布式系列篇-CSDN博客 【java八股文】之多線程篇-CSDN博客 【java八股文】之JVM基礎(chǔ)篇-CSDN博客 【java八股文】之計算

    2024年01月17日
    瀏覽(70)
  • 3.Java面試題—JVM基礎(chǔ)、內(nèi)存管理、垃圾回收、JVM 調(diào)優(yōu)

    3.Java面試題—JVM基礎(chǔ)、內(nèi)存管理、垃圾回收、JVM 調(diào)優(yōu)

    一篇文章掌握整個JVM,JVM超詳細(xì)解析?。?! JVM (Java虛擬機) 是運行 Java 字節(jié)碼 的 虛擬機 。 JVM 針對 不同系統(tǒng) 有 特定實現(xiàn) ( Windows 、 Linux 等),目的是 同樣的代碼 在 不同平臺 能運行出 相同的結(jié)果 。 Java 語言 要經(jīng)過 編譯 和 解釋 兩個步驟: 編譯 :通過 編譯器 將 代碼 一

    2024年02月15日
    瀏覽(23)
  • Java 面試八股文

    參考: 2023年 Java 面試八股文(20w字)_json解析失敗_leader_song的博客-CSDN博客

    2024年02月13日
    瀏覽(26)
  • Java面試必備八股文

    Java面試必備八股文

    1.1)Java有哪幾種數(shù)據(jù)類型 基本數(shù)據(jù)類型:byte(1字節(jié)) short(2字節(jié)) int(4字節(jié)) long(8字節(jié)) float(4字節(jié)) double(8字節(jié)) char(2字節(jié)) boolean(1字節(jié)) 引用數(shù)據(jù)類型:String 類 接口 抽象類 枚舉 數(shù)組 1.2)JVM、JRE和JDK的關(guān)系 JVM指的是Java的虛擬機,Java程序需要運行在虛擬機上

    2023年04月08日
    瀏覽(35)
  • Java面試八股文寶典:序言

    Java作為一門廣泛應(yīng)用于企業(yè)級應(yīng)用開發(fā)的編程語言,一直以來都是技術(shù)面試中的重要話題。無論您是剛剛踏入編程世界的新手,還是經(jīng)驗豐富的Java開發(fā)工程師,都需要通過面試來展示自己的技能和知識。 在面試中,除了技術(shù)知識,還需要展現(xiàn)出解決問題、溝通能力和編程實

    2024年02月09日
    瀏覽(38)
  • 【八股文篇】Java 面試題

    【八股文篇】Java 面試題

    ?? 博主介紹 : 博主從事應(yīng)用安全和大數(shù)據(jù)領(lǐng)域,有8年研發(fā)經(jīng)驗,5年面試官經(jīng)驗,Java技術(shù)專家,WEB架構(gòu)師,阿里云專家博主,華為云云享專家,51CTO TOP紅人 Java知識圖譜點擊鏈接: 體系化學(xué)習(xí)Java(Java面試專題) ???? 感興趣的同學(xué)可以收藏關(guān)注下 , 不然下次找不到喲

    2024年02月12日
    瀏覽(26)
  • 一天吃透Java面試八股文

    一天吃透Java面試八股文

    Java是一門面向?qū)ο蟮木幊陶Z言 。面向?qū)ο蠛兔嫦蜻^程的區(qū)別參考下一個問題。 Java具有平臺獨立性和移植性 。 Java有一句口號: Write once, run anywhere ,一次編寫、到處運行。這也是Java的魅力所在。而實現(xiàn)這種特性的正是Java虛擬機JVM。已編譯的Java程序可以在任何帶有JVM的平臺

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包