成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聽廁所保潔的老大爺講Java的垃圾回收

開發 后端
“哎,今天面試被面試官虐慘了,一個勁兒的問垃圾回收的問題。開頭還能答幾個,后來都招架不住了”剛面試完的小橙一邊走進廁所,一邊在電話里和朋友抱怨著。

 “哎,今天面試被面試官虐慘了,一個勁兒的問垃圾回收的問題。開頭還能答幾個,后來都招架不住了”

剛面試完的小橙一邊走進廁所,一邊在電話里和朋友抱怨著。

[[325127]]

“一開始從JVM問我Java堆的內存劃分,后來又問為什么要分年輕代年老代,哪些對象會被認為是垃圾,垃圾回收的 Root Set 有哪些。你說咱們不都是背個年輕代年老代,再記住個Eden、Survivor這些嗎...”

聽著小橙的抱怨,旁邊正在清理廁所地面的老大爺手中的拖把慢慢的慢了下來。

看著小橙掛斷電話還是一別「義憤填膺」的樣子,老大爺過來聊了起來。

“小伙子,還在死記硬背,看樣子你還沒理解Java 的垃圾回收呀”

“喲,您也懂Java ?” 小橙吃驚的看著老大爺,雖說平時??吹嚼洗鬆斣诖驋邘?,但還是第一次知道他也懂編程。

“不瞞你說,我之前也做過開發”。老大爺一邊說著一邊望向窗外的遠方,仿佛想起了以前的歲月。

“那您后來怎么不做了呢?” “老大爺~”

小橙的幾句話,又把老大爺拉回到現實中。

“哎,以后有機會再和你說。今天我大概給你說說我對Java 垃圾回收的理解吧,看看對你有沒有幫助”

“好啊” 小橙將信將疑。

伴著廁所內空氣清新劑的味道,老大爺深吸一口氣,講了起來。

“就以我這每天打掃的廁所來說吧。Java 里一般的「堆」內存不是要分幾個「代」嘛,對象內存分配盡量在年輕代進行。”

聽到「堆」、「年輕代」這些專業詞匯,感覺還真懂的樣子,小橙趕忙點了點頭。

“其實對象內存的分配和垃圾的回收之間,并不是獨立的,回收空間的方式也影響分配的方式”

“而這一切都是為了效率,和我們平時的打掃工作類似,如果不講究方法,就會一直忙個不停,效率還很差。你比如Java的垃圾回收過程中,為了不讓新的內存分配影響現有的垃圾回收工作,會有Stop-The-World,在這段時間,垃圾回收工作,分配對象的線程都得停止。”

“我們保潔就像垃圾回收線程一樣,你們上廁所的,就像分配內存的線程一樣。你應該有印象,為了盡快打掃干凈廁所給你們使用,有時候我們保潔也會在廁所門口立個小牌子,「清掃中,請勿使用」。沒錯,這就是我們的STW,你們不進來「搗亂」,我們就能很快的墩完地,擦干凈洗手池,后面你們就又能愉快的使用了”

“那每次都放個牌子,大家著急用也不方便啊”,小橙已經進入了這個生活的場景了。

“是的,所以像早上,中午大家在頻繁使用的時候,我們雖然也在打掃,但卻不能放個牌子。這個時候用過的池子我會清洗,因為用過的,我能一眼看出來,就像第一步的垃圾標記一樣,在清洗的時候,不影響大家使用其他的,就像垃圾回收CMS的并行執行一樣。”

“為了進一步提升大家上廁所的效率,我們也給廁所分了代。左邊的一排是給大手留的,像老年代一樣,右邊一排是小手的,像年輕代。這樣大對象直接分配到大手老年代,要占用時間長,而「短作業」直接在右邊快速解決快速離開,短作業的區域,我們也可以再分成兩半,我中間放個牌子,這樣保證分配的時候都是連續的空間,使用完一半再開放另一半。”

“萬一小手解到一半要玩大的的朋友,請到左邊。當然你說像在年輕代使用的「復制算法」,在我們這兒略有點不適用,不能一哥們進行到一半的時候,我說朋友,你挪到邊上那個,我把這個清洗一下。他非得打我不成。”

“標記-清除這個是最常用的,一般在工作時間,用過的便池,我們會人工標記一下,可能是記下來,也可能是往里放個標記,之后我們會馬上清洗。”

“標記-整理這個倒是也有類似的,比如我們也常會把幾個池子找個線分隔開一下,大家使用時先用這邊的,我把那邊不干凈的幾個統一收拾完了,再全部放開??赡苓@么說你不好類比。要不這么著,你就想著有個哥們他尿幾下要換一個地兒,所以他需要連續的幾個池子,所以我得把一個干凈一個臟這種不連續的清洗好了,給他們用”

“大爺,我現在有點亂兒”,聽著老大爺說了一籮筐的內容,小橙一會兒明白一會糊涂。

“來,我再給你捋一捋”

“你看啊,首先你記住最關鍵這一點,不同的垃圾回收方式,也決定了內存的分配方式,這兩個不是獨立的。同時為了更高效的完成工作,通常也會組合幾種回收方式一起用。比如「復制算法」,一般就用在年輕代這兒,因為畢竟一般的對象生存周期都不長,同時只要把標記出來的存活對象直接復制走就行,復制過去之后,空間還連續,多好。其余的直接清除就行了。所以在年輕代復制幾輪之后該清除的也就都清了。留下來的再搬到老年代”

“那老年代回收過程中,難免會出現清了這個對象,但它旁邊還被占用這種情況,那下次從年輕代過來一個大塊頭,或者年輕代過來兩情侶,人家要挨著坐,放不下怎么辦?所以還得把這些不連續的空間,給整理一下,存活的都排整齊了,其它地方空出來給新來的’,這時候就會用到咱們說的「標記-整理」”

“所以你應該發現了,不同的垃圾回收算法,因為要做的事情不同,所以費的時間也不同,針對高吞吐的和針對低延遲的必定不可兼得,只能權衡。所以你發現有些車站等,在人少的時候,可能會鎖上幾個,或者拉個線標記只能使用某部分,以此減小回收時間”

“說了半天垃圾回收,哪些是垃圾呢?我們一般是推開門,看哪個有人在用,我們會暗暗記住,哪個有用過的「痕跡」,都認為是垃圾。門是整個查找的「根」,每層樓里的各個廁所的門,都是我們查找「垃圾」的「根」。在垃圾回收里不是也叫「根搜索算法」,也叫「可達性分析」嘛,從「根」開始找,一直向下,能鏈接到的,叫可達對象,是存活的,沒人用的是垃圾。在 Java 里會把「虛擬機棧和本地方法棧」正在引用的對象、靜態屬性引用的對象和常量看做是「廁所的門」”。

“像一些小點的廁所,我們一個人打掃就行,那車站、機場這種大的場所內,一個人打掃不過來,為了更快收拾好,就會同時出動好幾個保潔,這就像垃圾回收里的 Parallel 收集器,多個線程一起,更快。”

“哦,對了, 垃圾回收里還有個「安全點」的概念,就是只有執行到這里再進行垃圾回收,才不會出錯,為什么呢?主要是為了讓垃圾回收的根集枚舉更精確,編譯器可以給每條指令都記一些信息,在需要STW的時候使用,可如果每個都記,代價太高,所以就選了一小部分,就是在安全點。如果廁所內某個時刻視為可以暫停的點,也就是女保潔需要清洗男廁,這個時候,需要觀察和詢問里面有沒有人,當某個時刻正好處于安全的時候,保潔開始工作,大家先停止使用”

看到又有幾個小伙走進廁所,“咱們以后有時間再聊”,說著,老大爺又像平時一樣,快速開始揮動拖把,認真的開始了「垃圾回收」。

責任編輯:武曉燕 來源: Tomcat那些事兒
相關推薦

2023-01-13 08:18:37

延遲雙刪策略

2019-01-18 20:36:40

Python佩奇turtle

2025-06-27 09:29:45

2009-07-06 17:34:22

Java垃圾回收

2020-12-10 08:43:17

垃圾回收JVM

2022-03-21 11:33:11

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

2021-01-04 10:08:07

垃圾回收Java虛擬機

2011-07-04 16:48:56

JAVA垃圾回收機制GC

2020-07-09 08:26:42

Kubernetes容器開發

2021-03-03 08:13:57

模式垃圾回收

2010-10-13 10:24:38

垃圾回收機制JVMJava

2010-12-13 11:14:04

Java垃圾回收算法

2009-06-25 17:48:24

Java垃圾回收

2009-12-30 10:14:29

JVM垃圾回收

2022-06-22 09:54:45

JVM垃圾回收Java

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-01-20 10:34:49

JVM垃圾回收算法

2024-08-20 16:27:54

2015-07-06 10:14:25

Java垃圾回收實戰

2009-06-23 14:15:00

Java垃圾回收
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人h动漫亚洲一区二区 | 欧美日本一区 | h视频在线观看免费 | 情侣酒店偷拍一区二区在线播放 | 日韩一区精品 | 一区二区三区在线播放 | 国产精品视频在线播放 | 日韩黄| 青青久草| 亚洲国产情侣自拍 | 91精品国产一区 | 国产一级片 | 国产成视频在线观看 | 亚洲精品乱码久久久久久按摩观 | 九九热在线观看 | 黄色三级在线播放 | 日日操视频 | 欧美精品一区二区三区在线播放 | 欧美激情久久久 | 成年人的视频免费观看 | 日韩精品一区二区三区在线 | 欧美国产91 | 国产95在线 | 久久久综合 | 久久久www成人免费无遮挡大片 | 亚洲视频在线观看免费 | 免费的av| 免费一区二区三区在线视频 | 99reav| 亚洲精品一区在线观看 | 成人毛片视频免费 | 成人深夜小视频 | 免费成人高清在线视频 | 日日操天天射 | 国产成人99久久亚洲综合精品 | 狠狠撸在线视频 | 成人免费在线观看 | 综合亚洲视频 | 一区二区免费 | 九九精品在线 | 亚洲精品一区二区在线观看 |