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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java面试之简述一下 Java 垃圾回收机制?

發(fā)布時間:2023/12/10 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java面试之简述一下 Java 垃圾回收机制? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

**什么是垃圾回收機制:**在系統(tǒng)運行過程中,會產(chǎn)生一些無用的對象,這些對象占據(jù)著一
定的內(nèi)存,如果不對這些對象清理回收無用對象的內(nèi)存,可能會導致內(nèi)存的耗盡,所以垃圾
回收機制回收的是內(nèi)存。同時 GC 回收的是堆區(qū)和方法區(qū)的內(nèi)存。
JVM 回收特點:(stop-the-world)當要進行垃圾回收時候,不管何種 GC 算法,除了垃圾回收
的線程之外其他任何線程都將停止運行。被中斷的任務(wù)將會在垃圾回收完成后恢復進行。
GC 不同算法或是 GC 調(diào)優(yōu)就是減少 stop-the-world 的時間。à(為何非要 stop-the-world),就像是一個同學的聚會,地上有很多垃圾,你去打掃,邊打掃邊丟垃圾怎么都不可能打掃干凈的哈。當在垃圾回收時候不暫停所有的程序,在垃圾回收時候有 new 一個新的對象 B,此時對象 A 是可達 B 的,但是沒有來及標記就把 B 當成無用的對象給清理掉了,這就會導致程序的運行會出現(xiàn)錯誤。
如何判斷哪些對象需要回收呢:
**引用計數(shù)算法(java 中不是使用此方法):**每個對象中添加一個引用計數(shù)器,當有別人
引用它的時候,計數(shù)器就會加 1,當別人不引用它的時候,計數(shù)器就會減 1,當計數(shù)器為 0
的時候?qū)ο缶涂梢援敵衫?。算法簡?#xff0c;但是最大問題就是在循環(huán)引用的時候不能夠正確把
對象當成垃圾。
**根搜索方法(這是后面垃圾搜集算法的基礎(chǔ)):**這是 JVM 一般使用的算法,設(shè)立若干
了根對象,當上述若干個跟對象對某一個對象都不可達的時候,這個對象就是無用的對象。
對象所占的內(nèi)存可以回收。
根搜索算法的基礎(chǔ)上,現(xiàn)代虛擬機的實現(xiàn)當中,垃圾搜集的算法主要有三種,分別是標記- 清除算法、復制算法、標記-整理算法。
**標記-消除算法:**當堆中的有效內(nèi)存被耗盡的時候,就會停止整個系統(tǒng),就會調(diào)用標記- 消除算法,主要做兩件事,1 就是標記,2 就是清除。然后讓程序恢復。
標記:遍歷所有 GCroots 把可達的對象標記為存活的對象。
清除:把未標記為存活的對象清楚掉。
缺點:
就是效率相對比較低。會導致 stop-the-world 時間過長。
因為無用的對象內(nèi)存不是連續(xù)的因此清理后的內(nèi)存也不是連續(xù)的,(會產(chǎn)生內(nèi)存碎片)因此
JVM 還要維持一個空閑列表,增加一筆開銷,同時在以后內(nèi)存使用時候,去查找可用的內(nèi)存
這個效率也是很低的。
復制算法:(這個算法一般適合在新生代 GC),將原有的內(nèi)存分為兩塊,每次只適用其中的一塊,在垃圾回收的時候,將一塊正在使用的內(nèi)存中存活(上述根搜索的算法)的對象復制到另
一塊沒有使用的內(nèi)存中,原來的那一塊全部清除。與上述的標記-清除算法相比效率更高,
但是不太適合使用在對象存活較多的情況下(如老年代)。
**缺點:**每次對整個半?yún)^(qū)內(nèi)存回收,因此效率比上面的要高點,同時在分配內(nèi)存的時候不
需要考慮內(nèi)存的碎片。按照順序分配內(nèi)存。簡單高效。
但是最大的問題在于此算法在對象存活率非常低的時候使用,將可用內(nèi)存分為兩份,每次只
使用一份這樣極大浪費了內(nèi)存。
注意(重要):現(xiàn)在的虛擬機使用復制算法來進行新生代的內(nèi)存回收。因為在新生代中絕大
多數(shù)的對象都是“朝生夕亡”,所以不需要將整個內(nèi)存分為兩個部分,而是分為三個部分,一
塊為 Eden 和兩塊較小的 Survivor 空間(比例->8:1:1)。每次使用 Eden 和其中的一塊 Survivor,
垃圾回收時候?qū)⑸鲜鰞蓧K中存活的對象復制到另外一塊 Survivor 上,同時清理上述 Eden 和
Survivor。所以每次新生代就可以使用 90%的內(nèi)存。只有 10%的內(nèi)存是浪費的。(不能保證每
次新生代都少于 10%的對象存活,當在垃圾回收復制時候如果一塊 Survivor 不夠時候,需要
老年代來分擔,大對象直接進入老年代)
標記-整理算法:(老年代 GC)在存活率較高的情況下,復制的算法效率相對比較低,同時還
要考慮存活率可能為 100%的極端情況,因此又不能把內(nèi)存分為兩部分的復制算法。
在上面標記-復制算法的基礎(chǔ)之上,演變出了一個新的算法就是標記-整理算法。首先從
GCroots 開始標記所有可達的對象,標記為存活的對象。然后將存活的對象壓縮到內(nèi)存一端
按照內(nèi)存地址的次序依次排列,然后末端內(nèi)存地址之后的所有內(nèi)存都清除。
**總結(jié):**將標記存活的對象按照內(nèi)存地址順序排列到內(nèi)存另一端,末端內(nèi)存地址之后的內(nèi)
存都會被清除。
**比較:**相比較于標記-清楚算法 (傳統(tǒng)的),該算法可以解決內(nèi)存碎片問題同時還可以解
決復制算法部分內(nèi)存不能利用的問題。但是標記-整理算法的效率也不是很高。
->上述算法都是根據(jù)根節(jié)點搜索算法來判斷一個對象是不是需要回收,而支撐根節(jié)點搜索算
法能夠正常工作理論依據(jù)就是語法中變量作用域的相關(guān)內(nèi)容。
三種算法比較:
**效率:**復制算法>標記-整理算法>標記-清除算法;
**內(nèi)存整齊度:**復制算法=標記-整理算法>標記-清除算法
**內(nèi)存利用率:**標記-整理算法=標記-清除算法>復制算法
分代收集算法:現(xiàn)在使用的 Java 虛擬機并不是只是使用一種內(nèi)存回收機制,而是分代收集的算法。就是將
內(nèi)存根據(jù)對象存活的周期劃分為幾塊。一般是把堆分為新生代、和老年代。短命對象存放在
新生代中,長命對象放在老年代中。
對于不同的代,采用不同的收集算法:
**新生代:**由于存活的對象相對比較少,因此可以采用復制算法該算法效率比較快。
**老年代:**由于存活的對象比較多哈,可以采用標記-清除算法或是標記-整理算法
(注意)新生態(tài)由于根據(jù)統(tǒng)計可能有 98%對象存活時間很短因此將內(nèi)存分為一塊比較大的
Eden 空間和兩塊較小的 Survivor 空間,每次使用 Eden 和其中一塊 Survivor。當回收時,將
Eden 和 Survivor 中還存活著的對象一次性地復制到另外一塊 Survivor 空間上,最后清理掉
Eden 和剛才用過的 Survivor 空間。
上述是垃圾回收機制的算法,但是垃圾回收器才是垃圾回收的具體實現(xiàn):
常見有五個垃圾回收器:
一:串行收集器:(Serial 收集器)
該收集器最古老、穩(wěn)定簡單是一個單線程的收集器,(stop-the-world)可能會產(chǎn)生長時間
的停頓. serial 收集器一定不能用于服務(wù)器端。這個收集器類型僅應(yīng)用于單核 CPU 桌面電腦。
新生代和老年代都會使用 serial 收集器。新生代使用復制算法(內(nèi)存分三塊的那個復制算法)。
老年代使用標記-整理算法。
二:并行收集器:(Parallel 收集器)
parallel 收集器使用多線程并行處理 GC,因此更快。當有足夠大的內(nèi)存和大量芯數(shù)時,parallel
收集器是有用的。它也被稱為“吞吐量優(yōu)先垃圾收集器?!?三:并行收集器:(Parallel Old 垃圾收集器)
相比于 parallel 收集器,他們的唯一區(qū)別就是在老年代所執(zhí)行的 GC 算法的不同。它執(zhí)行三
個步驟:標記-匯總-壓縮(mark – summary – compaction)。匯總步驟與清理的不同之處在
于,其將依然幸存的對象分發(fā)到 GC 預先處理好的不同區(qū)域,算法相對清理來說略微復雜一
點。
四:并行收集器:(CMS 收集器)
(ConcurrentMark Sweep:并發(fā)標記清除)是一種以獲取最短回收停頓時間為目標的收集器。
適合應(yīng)用在互聯(lián)網(wǎng)站或者 B/S 系統(tǒng)的服務(wù)器上,這類應(yīng)用尤其重視服務(wù)器的響應(yīng)速度,希望
系統(tǒng)停頓時間最短。五:G1 收集器
這個類型的垃圾收集算法是為了替代 CMS 收集器而被創(chuàng)建的,因為 CMS 收集器在長時間
持續(xù)運行時會產(chǎn)生很多問題。

總結(jié)

以上是生活随笔為你收集整理的java面试之简述一下 Java 垃圾回收机制?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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