最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

005、JVM的垃圾回收機(jī)制是用來(lái)干嘛的?為什么要垃圾回收?

2023-06-01 09:43 作者:儒猿課堂  | 我要投稿

JVM的垃圾回收機(jī)制是用來(lái)干嘛的?

為什么要垃圾回收?




目錄

  1. 前文回顧

  2. 對(duì)象的分配與引用

  3. 一個(gè)方法執(zhí)行完畢后會(huì)怎樣?

  4. 我們創(chuàng)建的Java對(duì)象其實(shí)都是占用內(nèi)存資源的

  5. 不再需要的那些對(duì)象應(yīng)該怎么處理?

  6. 本文小結(jié)



1、前文回顧

上一篇文章給大家分析了JVM中的幾塊內(nèi)存區(qū)域分別都是干什么的,今天的文章就給大家初步介紹一下垃圾回收的概念。

但是今天的文章對(duì)垃圾回收不會(huì)切入過深,因?yàn)楹芏鄬W(xué)習(xí)專欄的朋友都是一些初學(xué)者。

因此,咱們還是那句話,盡量用最通俗的語(yǔ)言配合大量手繪圖,讓大家初步了解垃圾回收到底是什么。

先來(lái)看一下昨天的一張圖,回顧一下JVM中幾塊內(nèi)存區(qū)域的作用。

大家腦子里一定要有一個(gè)會(huì)動(dòng)的圖,你的代碼在運(yùn)行的時(shí)候,起碼有一個(gè)main線程會(huì)去執(zhí)行所有的代碼,當(dāng)然也可能是你啟動(dòng)的別的線程。

然后線程執(zhí)行時(shí)必須通過自己的程序計(jì)數(shù)器來(lái)記錄執(zhí)行到哪一個(gè)代碼指令了

另外線程在執(zhí)行方法時(shí),為每個(gè)方法都得創(chuàng)建一個(gè)棧幀放入自己的Java虛擬機(jī)棧里去,里面有方法的局部變量。

最后就是代碼運(yùn)行過程中創(chuàng)建的各種對(duì)象,都是放在Java堆內(nèi)存里的。

結(jié)合上面的大圖看一看,相信大家一定就明白是怎么回事了,大家對(duì)JVM的運(yùn)行原理也應(yīng)該都有了一個(gè)初步的理解和把握。


2、對(duì)象的分配與引用

現(xiàn)在我們假設(shè)有下面一段代碼,大概意思你可以理解為通過“l(fā)oadReplicasFromDisk”方法的執(zhí)行,去磁盤上加載需要的副本數(shù)據(jù)

然后通過“ReplicaManager”對(duì)象實(shí)例完成了這個(gè)操作。

代碼如下所示:

結(jié)合我們之前理解過的JVM運(yùn)行原理,一起通過動(dòng)態(tài)的圖來(lái)拆解一下上述代碼的運(yùn)行流程。

首先一個(gè)main線程肯定會(huì)來(lái)執(zhí)行main()方法里的代碼

main線程自己是有一個(gè)Java虛擬機(jī)棧的,他會(huì)把main()方法的棧幀壓入Java虛擬機(jī)棧

如下圖所示:

接著main()方法里調(diào)用了loadReplicasFromDisk()方法

那么就會(huì)創(chuàng)建loadReplicasFromDisk()方法的棧幀,壓入main線程的Java虛擬機(jī)棧里去

這個(gè)過程如下圖:

此時(shí)發(fā)現(xiàn)在loadReplicasFromDisk()方法里,有一個(gè)“repliaManager”變量,那么就會(huì)在loadReplicasFromDisk()方法對(duì)應(yīng)的棧幀里,放入一個(gè)“repliaManager”變量。

繼續(xù)看下圖:

接著發(fā)現(xiàn)在代碼里創(chuàng)建了一個(gè)“ReplicaManager”類的實(shí)例對(duì)象,此時(shí)就會(huì)在Java堆內(nèi)存中分配這個(gè)實(shí)例對(duì)象的內(nèi)存空間。

同時(shí),讓loadReplicasFromDisk()方法的棧幀內(nèi)的“replicaManager”局部變量去指向那個(gè)Java堆內(nèi)存里的ReplicaManager實(shí)例對(duì)象,大家看下圖:

接下來(lái),就會(huì)執(zhí)行通過“replicaManager”局部變量引用的“ReplicaManager”實(shí)例對(duì)象去執(zhí)行他的load()方法,去完成我們實(shí)現(xiàn)的業(yè)務(wù)邏輯。

好,到這里為止,其實(shí)都是上篇文章講解過的知識(shí),我們就是重新串聯(lián)了一遍,相信大家都很好理解。


3、一個(gè)方法執(zhí)行完畢之后會(huì)怎么樣?

接著大家來(lái)回顧一下上面的代碼。

其實(shí)目前的圖我們已經(jīng)表述到了“replicaManager.load()”這行代碼這里

那么現(xiàn)在有個(gè)問題,如果這行代碼執(zhí)行結(jié)束了,此時(shí)會(huì)怎么樣?

大家還記得之前文章說(shuō)過,一旦方法里的代碼執(zhí)行完畢,那么方法就執(zhí)行完畢了,也就是說(shuō)loadReplicasFromDisk()方法就執(zhí)行完畢了。

一旦你的loadReplicasFromDisk()方法執(zhí)行完畢,此時(shí)就會(huì)把loadReplicasFromDisk()方法對(duì)應(yīng)的棧幀從main線程的Java虛擬機(jī)棧里出棧

如下圖所示:

此時(shí)一旦loadReplicasFromDisk()方法的棧幀出棧,那么大家會(huì)發(fā)現(xiàn)那個(gè)棧幀里的局部變量,“replicaManager”,也就沒有了。

也就是說(shuō),沒有任何一個(gè)變量指向Java堆內(nèi)存里的“ReplicaManager”實(shí)例對(duì)象了。


4、我們創(chuàng)建的Java對(duì)象其實(shí)都是占用內(nèi)存資源的

核心點(diǎn)來(lái)了,此時(shí)大家發(fā)現(xiàn)了,Java堆內(nèi)存里的那個(gè)“ReplicaManager”實(shí)例對(duì)象已經(jīng)沒有人引用他了

這個(gè)對(duì)象實(shí)際上已經(jīng)沒用了,該干的事兒都干完了,現(xiàn)在你還讓他留在內(nèi)存里干啥呢?

大家要知道,內(nèi)存資源是有限的。

一般來(lái)說(shuō),我們會(huì)在一臺(tái)機(jī)器上啟動(dòng)一個(gè)Java系統(tǒng),機(jī)器的內(nèi)存資源是有限的,比如就4個(gè)G的內(nèi)存

然后我們啟動(dòng)的Java系統(tǒng)本質(zhì)就是一個(gè)JVM進(jìn)程,他負(fù)責(zé)運(yùn)行我們的系統(tǒng)的代碼,這個(gè)之前都解釋過了。

那么這個(gè)JVM進(jìn)程本身也是會(huì)占用機(jī)器上的部分內(nèi)存資源,比如占用2G的內(nèi)存資源。

那么我們?cè)贘VM的Java堆內(nèi)存中創(chuàng)建的對(duì)象,其實(shí)本質(zhì)也是會(huì)占用JVM的內(nèi)存資源的,比如“ReplicaManager”實(shí)例對(duì)象,會(huì)占用500字節(jié)的內(nèi)存。

所以大家看到這里,心中應(yīng)該無(wú)比明白的一個(gè)核心點(diǎn):我們?cè)贘ava堆內(nèi)存里創(chuàng)建的對(duì)象,都是占用內(nèi)存資源的,而且內(nèi)存資源有限。

大家看下面的圖,感受會(huì)深一點(diǎn)。


5、不再需要的那些對(duì)象應(yīng)該怎么處理?

繼續(xù)思考上面的圖,既然“ReplicaManager”對(duì)象實(shí)例是不需要使用的,已經(jīng)沒有任何方法的局部變量在引用這個(gè)實(shí)例對(duì)象了,而且他還空占著內(nèi)存資源,那么我們應(yīng)該怎么處理呢?

答案呼之欲出:JVM的垃圾回收機(jī)制

JVM本身是有垃圾回收機(jī)制的,他是一個(gè)后臺(tái)自動(dòng)運(yùn)行的線程

你只要啟動(dòng)一個(gè)JVM進(jìn)程,他就會(huì)自帶這么一個(gè)垃圾回收的后臺(tái)線程。

這個(gè)線程會(huì)在后臺(tái)不斷檢查JVM堆內(nèi)存中的各個(gè)實(shí)例對(duì)象

還是給大家畫一張圖,來(lái)看看這個(gè)過程:

如果某個(gè)實(shí)例對(duì)象沒有任何一個(gè)方法的局部變量指向他,也沒有任何一個(gè)類的靜態(tài)變量,包括常量等地方在指向他。

那么這個(gè)垃圾回收線程,就會(huì)把這個(gè)沒人指向的“ReplicaManager”實(shí)例對(duì)象給回收掉,從內(nèi)存里清除掉,讓他不再占用任何內(nèi)存資源。

這樣的話,這些不再被人指向的對(duì)象實(shí)例,即JVM中的“垃圾”,就會(huì)定期的被后臺(tái)垃圾回收線程清理掉,不斷釋放內(nèi)存資源

大家看下圖:

到此為止,相信大家跟上文章思路一路看下來(lái),就很清晰明了。到底什么是JVM中的“垃圾”?什么又是JVM的“垃圾回收”!


6、本文小結(jié)

不知不覺,第一周的文章都更新完畢了,希望大家溫故而知新。

既然是付費(fèi)來(lái)學(xué)習(xí)知識(shí)的,一定要對(duì)自己負(fù)責(zé),堅(jiān)持把每篇文章多看幾遍,把知識(shí)吃透。

這周,我們?yōu)榱苏疹櫤芏郕VM的小白同學(xué),從0起步,用最通俗易懂的語(yǔ)言和一步一圖的方式,把你寫好的Java代碼如何通過JVM運(yùn)行起來(lái)的核心原理都講清楚了。

目前為止,大家應(yīng)該對(duì)JVM的核心運(yùn)行流程、JVM的類加載機(jī)制、JVM的內(nèi)存區(qū)域以及垃圾回收機(jī)制都有一個(gè)初步的了解。

很多對(duì)JVM有一定了解的朋友一定會(huì)說(shuō):這些內(nèi)容都很簡(jiǎn)單,有沒有深入點(diǎn)的干貨?

有!但是請(qǐng)不要著急,我們的專欄是兼顧各種基礎(chǔ)的朋友,所以需要循序漸進(jìn),從淺入深。

比如JVM垃圾回收機(jī)制,就會(huì)在第三周詳細(xì)講解JVM的各種垃圾回收的細(xì)節(jié)

所以請(qǐng)大家稍安勿躁,一步一步來(lái),如果有一定基礎(chǔ)的同學(xué),就當(dāng)做復(fù)習(xí)一遍。

馬上周末就是第一周的作業(yè)和答疑集錦了,大家周末記得完成作業(yè),同時(shí)看一下每周最新的精華答疑集錦,從答疑中也能學(xué)習(xí)到一些知識(shí)。


7、希望大家多幫忙宣傳和推廣

專欄剛上線的時(shí)候,是拜托我的好朋友在公眾號(hào)里宣傳的,現(xiàn)在他還在一直堅(jiān)持幫我們宣傳,非常的感謝他。

不過當(dāng)時(shí)剛上線,我們一篇文章都沒更新,很多朋友對(duì)我們的文章質(zhì)量是沒有了解的,所以可能會(huì)猶豫不決要不要購(gòu)買

不過經(jīng)過一周文章下來(lái),相信很多一路跟下來(lái)的朋友,都對(duì)這個(gè)專欄質(zhì)量有了自己的了解和認(rèn)可。

我和即將發(fā)布專欄的幾位朋友都長(zhǎng)年工作于一線大廠,比如阿里、百度、美團(tuán),等等,負(fù)責(zé)過多個(gè)大型系統(tǒng)的架構(gòu)設(shè)計(jì)。

之所以聚在儒猿技術(shù)窩這個(gè)平臺(tái)開設(shè)專欄,初衷就是為了幫助國(guó)內(nèi)廣大的java工程師,解決大家在面試中、工作中的一些痛點(diǎn)問題。

現(xiàn)在網(wǎng)上很多技術(shù)資料,但是魚龍混雜,底子薄弱的朋友很難辨別其內(nèi)容優(yōu)劣,很容易被帶跑偏。

所以我們幾個(gè)朋友才希望通過自己的思路,來(lái)做一些高質(zhì)量的專欄,將我們多年一線工作經(jīng)驗(yàn)濃縮精華,傳授給大家,也是為國(guó)內(nèi)IT界盡一點(diǎn)綿薄之力。

但是由于剛開始做,很多人不了解我們,所以還是希望購(gòu)買我們專欄的朋友,如果覺得我們的內(nèi)容不錯(cuò),幫忙多宣傳一下。

大家可以根據(jù)下面步驟生成自己的海報(bào),推薦給朋友,分享技術(shù)的同時(shí)還能獲得一點(diǎn)收益。

最后,感謝大家為我們堅(jiān)持長(zhǎng)期推出更多好的專欄做出的支持!


8、昨日思考題解答

我們回到文章中,昨天給了一個(gè)思考題:我們創(chuàng)建的那些對(duì)象,到底在Java堆內(nèi)存里會(huì)占用多少內(nèi)存空間呢?

這個(gè)其實(shí)很簡(jiǎn)單,一個(gè)對(duì)象對(duì)內(nèi)存空間的占用,大致分為兩塊:

  • 一個(gè)是對(duì)象自己本身的一些信息

  • 一個(gè)是對(duì)象的實(shí)例變量作為數(shù)據(jù)占用的空間

比如對(duì)象頭,如果在64位的linux操作系統(tǒng)上,會(huì)占用16字節(jié),然后如果你的實(shí)例對(duì)象內(nèi)部有個(gè)int類型的實(shí)例變量,他會(huì)占用4個(gè)字節(jié),如果是long類型的實(shí)例變量,會(huì)占用8個(gè)字節(jié)。如果是數(shù)組、Map之類的,那么就會(huì)占用更多的內(nèi)存了。

另外JVM對(duì)這塊有很多優(yōu)化的地方,比如補(bǔ)齊機(jī)制、指針壓縮機(jī)制,這塊東西我們不會(huì)單獨(dú)拿出來(lái)講,因?yàn)楸容^復(fù)雜,而且暫時(shí)對(duì)大家還不是很需要。

其實(shí)我信奉的一個(gè)道理,就是用案例實(shí)戰(zhàn)來(lái)說(shuō)話,引出很多技術(shù)和知識(shí)點(diǎn)的講解,所以很多類似的知識(shí),我會(huì)在后期大量的案例中去分析,需要的時(shí)候再學(xué),效果最好。

這里就是先科普一下,讓大家有一個(gè)基本的概念,如果有興趣可以百度資料自己查閱。


8、今日思考題

既然今天提到了Java堆內(nèi)存里的對(duì)象會(huì)被回收掉,那么加載到方法區(qū)的類會(huì)被垃圾回收嗎?什么時(shí)候被回收?為什么呢?

大家可以思考一下這個(gè)問題,下周一的文章里會(huì)給出解答。

End



版權(quán):公眾號(hào)儒猿技術(shù)窩

未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任

005、JVM的垃圾回收機(jī)制是用來(lái)干嘛的?為什么要垃圾回收?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
民和| 涞源县| 乌恰县| 囊谦县| 玉林市| 临西县| 视频| 哈巴河县| 永胜县| 临猗县| 台湾省| 晋中市| 舟曲县| 临桂县| 缙云县| 玛沁县| 陆川县| 清水县| 鹤壁市| 虎林市| 和田市| 定南县| 达尔| 定陶县| 锦州市| 玛多县| 阿尔山市| 乃东县| 齐齐哈尔市| 巫溪县| 九龙县| 北宁市| 梨树县| 清远市| 任丘市| 炎陵县| 吉隆县| 东丽区| 扶沟县| 长子县| 柘荣县|