自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

只要面試都會問到的垃圾收集算法,還不趕快收藏!?。?/h1>

開發(fā) 前端
在 GC 過程中移動存活對象,并更新所有引用這些對象的地方的數據,是一種極為負重的操作,而且移動操作必須暫停用戶應用進程才能進行。這種暫停被描述為“ Stop The World”,也就是 STW。

垃圾收集算法

1. 分代收集理論

1.1 分代假說

  1. 弱分代假說:絕大多數的對象存活時間很短,朝生夕滅。
  2. 強分代假說:熬過越多次的垃圾回收次數,對象越難被消滅。
  3. 跨代引用假說:跨代引用相對于同代引用而言僅僅只占一小部分。

1.2 垃圾回收器設計

基于弱分代假說和強分代假說,多款常用垃圾回收器的統(tǒng)一設計原則:收集器應該將Java堆劃分不同的區(qū)域,根據對象年齡分配待不同的區(qū)域中存。

在Java堆內存中,分兩部分:

  • 新生代:這部分區(qū)域中的對象存活時間都很短,基本遇到垃圾回收就會被清除
  • 老年代:這部分區(qū)域中的對象存活時間很久了,熬過多次垃圾回收 ,年齡很大,很難被清除。

對于新生代的垃圾回收,垃圾收集器并不需要去關注回收的對象,只需要關注存活下來的對象。 每次回收后存活的少量對象,將逐步升級到老年代當中。

對于老年代的垃圾回收,虛擬機可以用較低的頻率回收這個區(qū)域。這樣子就同時兼顧了垃圾回收的時間開銷和內存空間的有效利用。

將Java堆分成新生代和老年代分別使用不同的策略垃圾回收之后,出現一個問題:跨代引用。存在相互引用的兩個對象,應該是同時生存同時消亡的。如果新生代與老年代的對象存在跨代引用,那么由于老年代的關系所以這兩個對象很難被回收。當新生代對象到達足夠年齡之后,將進入老年代,此時的跨代引用就消除了。

很好的辦法,等就對了。當然不是!那樣子老年代就會越來越臃。但是我們又不想為了一個跨代引用對整個老年代進行掃描,那么就通過一個叫記憶集的結構來解決。

記憶集將老年代劃分為若干個小塊,標記了老年代的哪一塊存在跨代引用。當新生代進行垃圾回收的時候,通過記憶集將包含了跨代引用的那一小部分老年代也會進行垃圾回收。

1.3垃圾回收

  • 新生代收集 Minor GC / Young GC:指目標指示新生代的垃圾收集
  • 老年代收集 Major GC / Old GC:指目標指示老年代的垃圾收集
  • 混合收集 Mixed GC:整個新生代和部分老年代的垃圾收集
  • 整堆收集 Full GC:收集整個 Java 堆和方法區(qū)的垃圾收集

2. 標記-清除算法

2.1 介紹

算法分為“標記”和“清除”兩個階段:首先標記出所有需要回 收的對象,在標記完成后,統(tǒng)一回收掉所有被標記的對象,也可以反過來,標記存活的對象,統(tǒng)一回 收所有未被標記的對象。

2.2 缺點

  1. 執(zhí)行效率不穩(wěn)定,效率隨著對象數量的增加而降低
  2. 內存碎片問題,清除之后出現不連續(xù)的內存碎片,當需要為大對象分配足夠的連續(xù)內存的時候,需要再次GC

3. 標記-復制算法

3.1. 介紹

它將可用 內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著 的對象復制到另外一塊上面,然后再把已使用過的內存空間一次清理掉。

3.2 缺點

  1. 如果存活對象過多,可能會有大量的時間浪費復制上,所以這方法主要是針對存活率小的情況。
  2. 空間浪費,,一般的空間作為保留區(qū)域。

3.3 作用

這種收集算法多用于回收新生代。

因為新生代中有98%的對象都熬不過第一輪的回收,只有2%的對象可以存活下來。如果盲目將新生代劃分為1 : 1的比例,就會浪費很多的空間。所以廠商們將新生代的布局劃分為了一塊較大的 Eden 空間和兩塊較小的 Survivor 空間。每次分配內存都是只是用 Eden 和其中一塊 Survivor 空間。當 Minor 垃圾回收后,將存活的對象存放在保留的 Survivor 空間中,清空 Eden 和之前使用的 Survivor 空間。

HotSpot 虛擬機默認 Eden 和 Survivor 的大小比例是 8 : 1,也就是每次新生代中可用的空間為 90%,只有一個 Survivor 會被浪費。當遇到一個 Survivor 空間不足以容納一次 Minor GC 后存活的對象時,就需要依賴老年代進行分配擔保。新生代的分配擔保就是指空間不夠放下存活對象,就會將這些對象通過分配擔保機制直接進入老年代。

4. 標記-整理算法

4.1 介紹

標記過程仍然與“標記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向內存空間一端移動,然后直接清理掉邊界以外的內存

5. 總結

在 GC 過程中移動存活對象,并更新所有引用這些對象的地方的數據,是一種極為負重的操作,而且移動操作必須暫停用戶應用進程才能進行。這種暫停被描述為“ Stop The World”,也就是 STW。

如果像標記-清除算法那樣子完全不考慮移動和整理,Java 堆中的空間碎片問題將十分嚴重,只能依賴更復雜的內存分配器和內存訪問器來解決。內存訪問是用戶程序中最頻繁的操作,如果在此環(huán)節(jié)上添加額外的負擔,勢必會直接影響程序的吞吐量。

那么移動會發(fā)生 STW,但是內存分配的時候更簡單。直接清除會產生內存碎片,但是垃圾回收的時候更方便。無論是移動與否都有弊端。從垃圾回收的 STW 來看,直接清除的 STW 最短,甚至不用停頓,但從整個程序的吞吐量來看,移動對象更劃算。不同的虛擬機實現廠商的注重點不同,他們的收集器也不一樣。

還有一種“和稀泥式”解決方案可以不在內存分配和訪問上增加太大額外負擔,做法是讓虛擬機平時多數時間都采用標記-清除算法,暫時容忍內存碎片的存在,直到內存空間的碎片化程度已經大到影響對象分配時,再采用標記-整理算法收集一次,以獲得規(guī)整的內存空間。前面提到的基于標記-清除算法的 CMS 收集器面臨空間碎片過多時采用的就是這種處理辦法。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-09-13 16:55:42

JavaScript數組

2018-09-11 12:54:53

面試HadoopKafka

2009-06-15 16:14:40

Java垃圾收集算法GC

2017-02-28 18:50:50

Windows 10Windows磁盤修復

2017-03-08 11:40:01

Windows 7Windows電腦型號

2024-02-19 07:12:21

Win11操作系統(tǒng)技巧

2020-11-20 10:47:47

網絡面試開發(fā)

2024-07-15 08:00:00

2010-01-06 16:33:50

.Net Framew

2024-03-15 08:04:30

G1CMSJVM

2011-10-08 13:54:27

JavaScript

2024-10-24 08:31:26

2016-09-21 22:12:43

網絡爬蟲Java開源

2018-02-01 09:26:12

面試算法題程序員

2023-02-26 11:50:04

Hbase程序Oracle

2010-03-04 10:08:54

.Net垃圾收集

2017-09-21 14:40:06

jvm算法收集器

2018-07-24 18:07:33

人工智能ARVR

2018-09-27 19:10:17

ARVRAI

2022-05-06 22:13:56

JVM垃圾收集算法
點贊
收藏

51CTO技術棧公眾號