大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

面試題首頁 > JVM面試題

JVM垃圾回收機制面試題

001什么是GC機制?

Java GC(Garbage Collection)垃圾回收機制,是Java與C++/C的主要區別。JVM通過GC來回收堆和方法區中的內存,這個過程是自動執行的。因此作為Java開發者,不需要專門去編寫內存回收和垃圾清理代碼,也不需要處理內存泄露和溢出的問題。雖然java不需要開發人員顯示的分配和回收內存,這對開發人員確實降低了不少編程難度,但也可能帶來一些副作用:
1.有可能不知不覺浪費了很多內存;
2.JVM花費過多時間來進行內存回收;
3.內存泄露;
Java GC機制主要完成3件事:確定哪些內存需要回收;確定什么時候需要執行GC;如何執行GC。

002如和判斷一個對象是否存活?

1.引用計數法
所謂引用計數法就是給每一個對象設置一個引用計數器,每當有一個地方引用這個對象時,就將計數器加一,引用失效時,計數器就減一。當一個對象的引用計數器為零時,說明此對象沒有被引用,也就是“死對象”,將會被垃圾回收.
引用計數法有一個缺陷就是無法解決循環引用問題,也就是說當對象 A 引用對象 B,對象B 又引用者對象 A,那么此時 A,B 對象的引用計數器都不為零,也就造成無法完成垃圾回收,所以主流的虛擬機都沒有采用這種算法。
2.可達性算法(引用鏈法)
該算法的思想是:從一個被稱為 GC Roots的對象開始向下搜索,如果一個對象到 GCRoots 沒有任何引用鏈相連時,則說明此對象不可用。
在 java 中可以作為 GC Roots 的對象有以下幾種:
(1)虛擬機棧中引用的對象方法區類靜態屬性引用的對象方法區常量池引用的對象本地方法棧 JNI 引用的對象
雖然這些算法可以判定一個對象是否能被回收,但是當滿足上述條件時,一個對象比不一定會被回收。當一個對象不可達 GC Root 時,這個對象并不會立馬被回收,而是出于一個死緩的階段,若要被真正的回收需要經歷兩次標記
(2)如果對象在可達性分析中沒有與 GC Root 的引用鏈,那么此時就會被第一次標記并且進行一次篩選,篩選的條件是是否有必要執行 finalize()方法。當對象沒有覆蓋 finalize()方法或者已被虛擬機調用過,那么就認為是沒必要的。
(3)如果該對象有必要執行 finalize()方法,那么這個對象將會放在一個稱為 F-Queue 的對隊列中,虛擬機會觸發一個 Finalize()線程去執行,此線程是低優先級的,并且虛擬機不會承諾一直等待它運行完,這是因為如果 finalize()執行緩慢或者發生了死鎖,那么就會造成 FQueue 隊列一直等待,造成了內存回收系統的崩潰。GC 對處于 F-Queue 中的對象進行第二次被標記,這時,該對象將被移除”即將回收”集合,等待回收。

003垃圾回收方式?

GC按照回收區域又分為兩大種類型:部分收集和整堆收集。
部分收集(Partial GC):不是完整收集整個Java堆的垃圾收集。其中又分為:
1. 新生代收集(Minor GC/Young GC):只是新生代的垃圾收集
當年輕代空間不足時,就會觸發MinorGC,這里的年輕代滿指的是Eden代滿,Survivor滿不會引發GC。
2. 老年代收集(MajorGC/o1dGC):只是老年代的圾收集。
3. 混合收集(MixedGC):收集整個新生代以及部分老年代的垃圾收集。
整堆收集(FullGC):收集整個java堆和方法區的垃圾收集。

004描述下GC過程。

1.在初始階段,新創建的對象被分配到Eden區,S0和S1的兩塊空間都為空。
2.當Eden區滿了的時候,Minor GC 被觸發 。經過掃描與標記,不存活的對象被回收,存活的對象被復制到S0,并且存活的對象年齡都增大一歲。
3.當Eden區又滿的時候,Minor GC再次被觸發。此時Eden區 和 S0區存活的對象要復制到S1。需要注意的是,此時Eden區和S0區被清空,S0中的對象復制到S1后其年齡要加1。
4.當Eden區再次又滿的時候,MinorGC則重復上面過程,將Eden區 和 S1區存活的對象復制到S0。此時Eden區和S1區被清空,S0中的對象復制到S1后其年齡要加1。
5.經過幾次Minor GC之后,當存活對象的年齡達到一個閾值之后(-XX:MaxTenuringThreshold默認是15),就會被從年輕代Promotion到老年代。
6.新生代 GC(Minor GC):指發生新生代的的垃圾收集動作,Minor GC 非常頻繁,回收速度一般也比較快。
7.老年代 GC(Major GC/Full GC):指發生在老年代的 GC,出現了 Major GC 經常會伴隨至少一次的 Minor GC(并非絕對),Major GC 的速度一般會比 Minor GC 的慢 10 倍以上。

005解釋強、軟、弱、虛引用?

JDK1.2 以前,一個對象只有被引用和沒有被引用兩種狀態。后來,Java 對引用的概念進行了擴充,將引用分為強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4 種,這 4 種引用強度依次逐漸減弱。

006垃圾回收算法有哪些?

一共有 4 種:標記-清除算法、復制算法、標記整理算法、分代收集算法;

007什么是標記-清除算法?

最基礎的收集算法是“標記-清除”(Mark-Sweep)算法,分為“標記”和“清除”兩個階段:首先標記出所有需要回收的對象,在標記完成后統一回收所有被標記的對象。

008標記-清除算法的缺點?

● 效率問題,標記和清除兩個過程的效率都不高;
● 空間問題,標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作。

009什么是復制算法?

它將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用過的內存空間一次清理掉。這樣使得每次都是對整個半區進行內存回收,內存分配時也就不用考慮內存碎片等復雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。只是這種算法的代價是將內存縮小為了原來的一半。復制算法的執行過程如下圖:

一般虛擬機都采用這種算法來回收新生代,因為新生代中的對象 98% 是“朝生夕死”的,所以并不需要按照 1:1 的比例來劃分內存空間,而是將內存分為一塊較大的 Eden 空間和兩塊較小的 Survivor 空間,每次使用 Eden 和其中一塊 Survivor 。當回收時,將 Eden 和 Survivor 中還存活著的對象一次性地復制到另外一塊 Survivor 空間上,最后清理掉 Eden 和剛才用過的 Survivor 空間。HotSpot 虛擬機默認 Eden:Survivor = 8:1,也就是每次新生代中可用內存空間為整個新生代容量的 90%(其中一塊Survivor不可用),只有 10% 的內存會被“浪費”。當然如果另外一塊 Survivor 空間沒有足夠空間存放上一次新生代收集下來的存活對象時,這些對象將直接通過分配擔保機制進入老年代。

010復制算法缺點?

復制算法適合年輕代,不適合老年代。因為在對象存活率較高時就要進行較多的復制操作,效率將會變低。更關鍵的是復制算法需要有額外的空間進行分配擔保,以應對被使用的內存中所有對象都 100% 存活的極端情況。

011什么是標記-整理算法

根據老年代的特點,有人提出了另外一種“標記-整理”(Mark-Compact)算法,標記過程仍然與“標記-清除”算法一樣,但后續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存。

012什么是分代收集算法?

"分代收集"(Generational Collection)算法是根據對象存活周期的不同將內存劃分為幾塊并采用不同的垃圾收集算法。一般是把 Java 堆分為新生代和老年代,這樣就可以根據各個年代的特點采用最適當的收集算法。在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用復制算法,只需要付出少量存活對象的復制成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記—清理”或者“標記—整理”算法來進行回收。

013Stop The World是什么意思?

進行垃圾收集時,必須暫停其他所有工作線程,Sun將這種事情叫做"Stop The World"。

014什么情況下新生代對象會晉升到老年代?

如果新生代的垃圾收集器為Serial和ParNew,并且設置了-XX:PretenureSizeThreshold參數,當對象大于這個參數值時,會被認為是大對象,直接進入老年代。
Young GC后,如果對象太大無法進入Survivor區,則會通過分配擔保機制進入老年代。
對象每在Survivor區中“熬過”一次Young GC,年齡就增加1歲,當它的年齡增加到一定程度(默認為15歲,可以通過-XX:MaxTenuringThreshold設置),就將會被晉升到老年代中。
如果在Survivor區中相同年齡所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象就可以直接進入老年代,無須等到MaxTenuringThreshold中要求的年齡。

015新生代中Eden區和Survivor區的默認比例?

在HotSpot虛擬機中,Eden區和Survivor區的默認比例為8:1:1,即-XX:SurvivorRatio=8,其中Survivor分為From Survivor和ToSurvivor,因此Eden此時占新生代空間的80%。

016Minor GC ,Major GC,Full GC是什么?

Minor GC是當年輕代空間不足時,就會觸發MinorGC,這里的年輕代滿指的是Eden代滿,Survivor滿不會引發GC(每次Minor GC會清理年輕代的內存)。因為Java對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度也比較快。這一定義既清晰又易于理解。Minor GC會引發STW,暫停其它用戶的線程,等垃圾回收結束,用戶線程才恢復運行
Major GC指發生在老年代的GC,對象從老年代消失時,我們說"Major Gc"或"Full GC"發生了。出現了MajorGc,經常會伴隨至少一次的Minor GC(但非絕對的,在Paralle1 Scavenge收集器的收集策略里就有直接進行MajorGC的策略選擇過程),也就是在老年代空間不足時,會先嘗試觸發MinorGc。如果之后空間還不足,則觸發Major GC,Major GC的速度一般會比MinorGc慢1e倍以上,STW的時間更長,如果Major GC后,內存還不足,就報OOM了;
Full GC是對年輕代和老年代都進行垃圾回收,Full GC 是開發或調優中盡量要避免的,這樣暫時時間會短一些。

017Minor GC和Full GC的觸發條件?

Minor GC觸發條件: 當Eden區滿時,觸發Minor GC。
Full GC觸發條件:
(1)調用System.gc時,系統建議執行Full GC,但是不必然執行
(2)老年代空間不足
(3)方法區空間不足
(4)通過Minor GC后進入老年代的平均大小大于老年代的可用內存
(5)由Eden區、From Space區向To Sp3ace區復制時,對象大小大于To Space可存,則把該對象轉存到老年代,且老年代的可用內存小于該對象大小;

018垃圾收集器有哪些?

019Serial垃圾收集器?

最基本的垃圾收集器,使用復制算法,單線程,雖然收集垃圾時需要暫停其他所有的工作線程,但簡單高效,是 java 虛擬機運行在 Client 模式下默認的新生代垃圾收集器。
在HotSpot虛擬機中,使用-XX:+UseSerialGC參數可以指定年輕代和老年代都使用串行收集器。等價于新生代用Serial GC,且老年代用Serial Old GC。

020ParNew 垃圾收集器?

是 Serial 收集器的多線程版本 ,除了多線程進行GC外,其他與Serial一樣,默認開啟和 CPU 數目相同的線程數 。是很多 java虛擬機運行在 Server 模式下新生代的默認垃圾收集器。
1)可以通過選項"-XX:+UseParNewGC"手動指定使用ParNew收集器執行內存回收任務。它表示年輕代使用并行收集器,不影響老年代
2)這里的多線程指的是垃圾收集時,多線程并行,并不是垃圾收集與程序運行并行
3)收集垃圾時,也需要暫停其他所有工作線程,然后多線程收集垃圾。
4)單CPU環境下,因為線程切換,性能較差。

021Parallel Scavenge 收集器?

關注程序的吞吐量,即吞吐量優先。主要適用于在后臺運算而不需要太多交互的任務。 自適應調節策略也是 ParallelScavenge 收集器與 ParNew 收集器的一個重要區別。
1)吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間) ; 吞吐量優先,意味著在單位時間內,STW的時間最短;與之相對應的 低延遲 就是暫停時間優先,盡可能讓單次STW時間最短;這兩個無法同時實現。
2)收集垃圾時,也需要暫停其他所有工作線程,然后多線程收集垃圾。
3)參數配置
-XX:+UseParallelGC 手動指定年輕代使用Parallel并行收集器執行內存回收任務。 
-XX:+UseParallelOldGC 手動指定老年代都是使用并行回收收集器。 
-XX:ParallelGCThreads 設置年輕代并行收集器的線程數。一般地,最好與CPU數量相等,以避免過多的線程數影響垃圾收集性能。  
-XX:MaxGCPauseMillis 設置垃圾收集器最大停頓時間(即STw的時間),單位是毫秒。 為了盡可能地把停頓時間控制在MaxGCPauseMills以內,收集器在工作時會調整Java堆大小或者其他一些參數。對于用戶來講,停頓時間越短體驗越好。但是在服務器端,我們注重高并發,整體的吞吐量。所以服務器端適合Parallel進行控制。該參數使用需謹慎。 
-XX:GCTimeRatio 垃圾收集時間占總時間的比例(=1/(N+1))。用于衡量吞吐量的大小。 取值范圍(0, 100)。默認值99,也就是垃圾回收時間不超過1%。與前一個-XX:MaxGCPauseMillis參數有一定矛盾性。暫停時間越長,Radio參數就容易超過設定的比例。  
-XX:+UseAdaptivesizePolicy 設置Parallel Scavenge收集器具有自適應調節策略 。在這種模式下,年輕代的大小、Eden和Survivor的比例、晉升老年代的對象年齡等參數會被自動調整,已達到在堆大小、吞吐量和停頓時間之間的平衡點。在手動調優比較困難的場合,可以直接使用這種自適應的方式,僅指定虛擬機的最大堆、目標的吞吐量(GCTimeRatio)和停頓時間(MaxGCPauseMills,讓虛擬機自己完成調優工作。

022Serial Old?

1)是Serial的老年代版本,收集垃圾時也需要暫停其他所有的工作線程。
2)是Client模式下默認的老年代垃圾收集器
3)Server模式下,搭配新生代的Parallel Scavenge 收集器使用(在 JDK1.5 之前版本中)。同時也作為老年代中使用 CMS 收集器的后備垃圾收集方案(當CMS發生Concurrent Mode Failure)。

023Parallel Old收集器?

1)Parallel Scavenge的老年代版本
2)吞吐量優先,意味著在單位時間內,STW的時間最短;與之相對應的 低延遲 就是暫停時間優先,盡可能讓單次STW時間最短;這兩個無法同時實現。
3)若相同對于吞吐量要求較高,可以Parallel Scavenge搭配Parallel Old使用。

024介紹CMS垃圾收集器的特點?

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很大一部分的Java應用集中在互聯網站或者B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。CMS收集器就非常符合這類應用的需求。
從名字(包含“Mark Sweep”)上就可以看出,CMS收集器是基于“標記—清除”算法實現的,它的運作過程可以分為6個步驟,包括:初始標記、并發標記、預處理、重新標記、并發清除、重置。
CMS是一款優秀的收集器,它的主要優點在名字上已經體現出來了:并發收集、低停頓,但是CMS還遠達不到完美的程度,它有以下3個明顯的缺點:
(1)CMS收集器對CPU資源非常敏感。
(2)CMS收集器無法處理浮動垃圾(Floating Garbage),可能出現“Concurrent Mode Failure”失敗而導致另一次Full GC的產生。
(3)CMS是一款基于“標記—清除”算法實現的收集器,這意味著收集結束時會有大量空間碎片產生。

025介紹下G1垃圾收集器的特點?

G1(Garbage-First)收集器是當今收集器技術發展的最前沿成果之一。G1是一款面向服務端應用的垃圾收集器。與其他GC收集器相比,G1具備如下特點:并行與并發、分代收集、空間整合、可預測的停頓。
在G1之前的其他收集器進行收集的范圍都是整個新生代或者老年代,而G1不再是這樣。使用G1收集器時,Java堆的內存布局就與其他收集器有很大差別,它將整個Java堆劃分為多個大小相等的獨立區域,雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔離的了,它們都是一部分Region(不需要連續)的集合。
G1收集器之所以能建立可預測的停頓時間模型,是因為它可以有計劃地避免在整個Java堆中進行全區域的垃圾收集。G1跟蹤各個Region里面的垃圾堆積的價值大小(回收所獲得的空間大小以及回收所需時間的經驗值),在后臺維護一個優先列表,每次根據允許的收集時間,優先回收價值最大的Region(這也就是Garbage-First名稱的來由)。這種使用Region劃分內存空間以及有優先級的區域回收方式,保證了G1收集器在有限的時間內可以獲取盡可能高的收集效率。
Mixed GC是G1垃圾收集器特有的收集方式,Mixed GC大致可劃分為全局并發標記(global concurrent marking)和拷貝存活對象(evacuation)兩個大部分:
global concurrent marking是基于SATB形式的并發標記,包括以下4個階段:初始標記(Initial Marking)、并發標記(Concurrent Marking)、最終標記(Final Marking)、清理(Clean Up)。Evacuation階段是全暫停的。它負責把一部分region里的活對象拷貝到空region里去,然后回收原本的region的空間。

026垃圾收集器的比較圖。

垃圾收集器 分類 作用位置 使用算法 特點 適用場景
Serial 串行 新生代 復制算法 響應速度優先 適用于單CPU環境下的client模式
ParNew 并行 新生代 復制算法 響應速度優先 多CPU環境Server模式下與CMS配合使用
Parallel 并行 新生代 復制算法 吞吐量優先 適用于后臺運算而不需要太多交互的場景
Serial Old 串行 老年代 標記-整理(壓縮)算法 響應速度優先 適用于單CPU環境下的Client模式
Paraller Old  并行 老年代 標記-整理(壓縮)算法 標記-整理(壓縮)算法 適用于后臺運算而不需要太多交互的場景
CMS 并發 老年代 標記-清除算法 響應速度優先 適用于互聯網或B/S業務
G1 并發、并行 新生代、老年代 標記-整理(壓縮)算法 響應速度優先 響應速度優先

目錄

返回頂部
主站蜘蛛池模板: 国产欧美一区二区三区免费看 | 性短视频在线观看免费不卡流畅 | 久久精品国产400部免费看 | 免费欧美一级片 | 久久999| 亚洲成人性视频 | 欧美乱大交xxxxx另类 | 天天做天天爱天天影视综合 | 国产美女一级毛片 | 久久久www免费看片 久久久不卡 | 国产精品2020观看久久 | 色xxx| 成年女人毛片免费播放视频m | 四色婷婷| 国产精品v欧美精品∨日韩 国产精品v一区二区三区 | 成人18免费网| 欧美性色福利视频在线观看 | 日本一区二区三区不卡在线视频 | 激情久久久久久久久久久 | 99精品久久99久久久久 | 欧美一级a毛片人人dvd | 大乳欲妇三级一区二区三区 | 亚洲欧美人成人综合在线50p | 国产你懂的在线 | 国内精品久久久久影院6 | 日本不卡高清视频 | 久久天天躁狠狠躁夜夜爽 | 亚洲国产成人久久一区二区三区 | 男人的天堂a在线 | 国产一区二区影院 | 337p色噜噜| 久久久欧美综合久久久久 | 性生生活三级视频观看 | 婷婷五月在线视频 | 亚洲性夜夜综合久久麻豆 | 香蕉视频毛片 | 国产成人一区二区三区影院免费 | 99热com| 久久中文字幕综合不卡一二区 | jazz欧美人免费xxxxxx | 国产素人在线 |