本篇內(nèi)容主要講解“什么是Java的垃圾回收機制”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“什么是Java的垃圾回收機制”吧!
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供華陰網(wǎng)站建設(shè)、華陰做網(wǎng)站、華陰網(wǎng)站設(shè)計、華陰網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、華陰企業(yè)網(wǎng)站模板建站服務(wù),十余年華陰做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
什么是自動垃圾回收?
自動垃圾回收是一種在堆內(nèi)存中找出哪些對象在被使用,還有哪些對象沒被使用,并且將后者刪掉的機制。
所謂使用中的對象(已引用對象),指的是程序中有指針指向的對象;而未使用中的對象(未引用對象),則沒有被任何指針給指向,因此占用的內(nèi)存也可以被回收掉。
在用 C 之類的編程語言時,程序員需要自己手動分配和釋放內(nèi)存。而 Java 不一樣,它有垃圾回收器,釋放內(nèi)存由回收器負(fù)責(zé)。本文接下來將介紹垃圾回收機制的基本過程。
第一步:標(biāo)記垃圾回收的第一步是標(biāo)記。垃圾回收器此時會找出哪些內(nèi)存在使用中,還有哪些不是。
上圖中,藍(lán)色表示已引用對象,橙色表示未引用對象。垃圾回收器要檢查完所有的對象,才能知道哪些有被引用,哪些沒。如果系統(tǒng)里所有的對象都要檢查,那這一步可能會相當(dāng)耗時間。關(guān)注Java技術(shù)棧微信公眾號,回復(fù):JVM46,可以獲取一份超全 JVM 調(diào)優(yōu)攻略。
第二步:清除這一步會刪掉標(biāo)記出的未引用對象。
內(nèi)存分配器會保留指向可用內(nèi)存的引用,以供分配新對象。
壓縮為了提升性能,刪除了未引用對象后,還可以將剩下的已引用對象放在一起(壓縮),這樣就能更簡單快捷地分配新對象了。
為什么需要分代垃圾收集?之前說過,逐一標(biāo)記和壓縮 Java 虛擬機里的所有對象非常低效:分配的對象越多,垃圾回收需時就越久。不過,根據(jù)統(tǒng)計,大部分的對象,其實用沒多久就不用了。
來看個例子吧。(下圖中,豎軸代表已分配的字節(jié),而橫軸代表程序運行時間)
上圖可見,存活(沒被釋放)的對象隨運行時間越來越少。而圖中左側(cè)的那些峰值,也表明了大部分對象其實都挺短命的。
JVM 分代根據(jù)之前的規(guī)律,就可以用來提升 JVM 的效率了。方法是,把堆分成幾個部分(就是所謂的分代),分別是新生代、老年代,以及永生代。
新對象會被分配在新生代內(nèi)存。一旦新生代內(nèi)存滿了,就會開始對死掉的對象,進(jìn)行所謂的小型垃圾回收過程。一片新生代內(nèi)存里,死掉的越多,回收過程就越快;至于那些還活著的對象,此時就會老化,并最終老到進(jìn)入老年代內(nèi)存。
Stop the World 事件 —— 小型垃圾回收屬于一種叫 “Stop the World” 的事件。在這種事件發(fā)生時,所有的程序線程都要暫停,直到事件完成(比如這里就是完成了所有回收工作)為止。
老年代用來保存長時間存活的對象。通常,設(shè)置一個閾值,當(dāng)達(dá)到該年齡時,年輕代對象會被移動到老年代。最終老年代也會被回收。這個事件成為 Major GC。
Major GC 也會觸發(fā)STW(Stop the World)。通常,Major GC會慢很多,因為它涉及到所有存活對象。所以,對于響應(yīng)性的應(yīng)用程序,應(yīng)該盡量避免Major GC。還要注意,Major GC的STW的時長受年老代垃圾回收器類型的影響。
永久代包含JVM用于描述應(yīng)用程序中類和方法的元數(shù)據(jù)。永久代是由JVM在運行時根據(jù)應(yīng)用程序使用的類來填充的。此外,Java SE類庫和方法也存儲在這里。
如果JVM發(fā)現(xiàn)某些類不再需要,并且其他類可能需要空間,則這些類可能會被回收。
世代垃圾收集過程
現(xiàn)在你已經(jīng)理解了為什么堆被分成不同的代,現(xiàn)在是時候看看這些空間是如何相互作用的。后面的圖片將介紹JVM中的對象分配和老化過程。關(guān)注Java技術(shù)棧微信公眾號,回復(fù):JVM46,可以獲取一份超全 JVM 調(diào)優(yōu)攻略。
首先,將任何新對象分配給 eden 空間。兩個 survivor 空間都是空的。
當(dāng) eden 空間填滿時,會觸發(fā)輕微的垃圾收集。
引用的對象被移動到第一個 survivor 空間。清除 eden 空間時,將刪除未引用的對象。
在下一次Minor GC中,Eden區(qū)也會做同樣的操作。刪除未被引用的對象,并將被引用的對象移動到Survivor區(qū)。然而,這里,他們被移動到了第二個Survivor區(qū)(S1)。
此外,第一個Survivor區(qū)(S0)中,在上一次Minor GC幸存的對象,會增加年齡,并被移動到S1中。待所有幸存對象都被移動到S1后,S0和Eden區(qū)都會被清空。注意,Survivor區(qū)中有了不同年齡的對象。
在下一次Minor GC中,會重復(fù)同樣的操作。不過,這一次Survivor區(qū)會交換。被引用的對象移動到S0,。幸存的對象增加年齡。Eden區(qū)和S1被清空。
此幻燈片演示了 promotion。在較小的GC之后,當(dāng)老化的物體達(dá)到一定的年齡閾值(在該示例中為8)時,它們從年輕一代晉升到老一代。
隨著較小的GC持續(xù)發(fā)生,物體將繼續(xù)被推廣到老一代空間。
所以這幾乎涵蓋了年輕一代的整個過程。最終,將主要對老一代進(jìn)行GC,清理并最終壓縮該空間。
到此,相信大家對“什么是Java的垃圾回收機制”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
文章名稱:什么是Java的垃圾回收機制
標(biāo)題URL:http://www.rwnh.cn/article48/psgphp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、全網(wǎng)營銷推廣、App開發(fā)、、小程序開發(fā)、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)