成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

分析Java內(nèi)存管理與垃圾回收

這篇文章主要介紹“分析Java內(nèi)存管理與垃圾回收”,在日常操作中,相信很多人在分析Java內(nèi)存管理與垃圾回收問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”分析Java內(nèi)存管理與垃圾回收”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁設(shè)計師等,應(yīng)用各種網(wǎng)絡(luò)程序開發(fā)技術(shù)和網(wǎng)頁設(shè)計技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)公司專業(yè)提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站制作(企業(yè)站、成都響應(yīng)式網(wǎng)站建設(shè)公司、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗的提升,我們力求做到極致!

Java是在JVM所虛擬出的內(nèi)存環(huán)境中運行的。內(nèi)存分為棧(stack)和堆(heap)兩部分。

棧的基本概念參考 紙上談兵: 棧 (stack)。許多語言利用棧數(shù)據(jù)結(jié)構(gòu)來記錄函數(shù)調(diào)用的次序和相關(guān)變量(參考 Linux從程序到進程)。

在Java中,JVM中的棧記錄了線程的方法調(diào)用。每個線程擁有一個棧。在某個線程的運行過程中,如果有新的方法調(diào)用,那么該線程對應(yīng)的棧就會增加一個存儲單元,即幀(frame)。在frame中,保存有該方法調(diào)用的參數(shù)、局部變量和返回地址。

分析Java內(nèi)存管理與垃圾回收

調(diào)用棧

Java的參數(shù)和局部變量只能是基本類型的變量(比如int),或者對象的引用(reference)。因此,在棧中,只保存有基本類型的變量和對象引用。

引用所指向的對象保存在堆中。(引用可能為Null值,即不指向任何對象)

分析Java內(nèi)存管理與垃圾回收

引用與對象

當(dāng)被調(diào)用方法運行結(jié)束時,該方法對應(yīng)的幀將被刪除,參數(shù)和局部變量所占據(jù)的空間也隨之釋放。線程回到原方法,繼續(xù)執(zhí)行。當(dāng)所有的棧都清空時,程序也隨之運行結(jié)束。

如上所述,棧(stack)可以自己照顧自己。但堆必須要小心對待。堆是JVM中一塊可自由分配給對象的區(qū)域。當(dāng)我們談?wù)摾厥?garbage collection)時,我們主要回收堆(heap)的空間。

Java的普通對象存活在堆中。與棧不同,堆的空間不會隨著方法調(diào)用結(jié)束而清空。因此,在某個方法中創(chuàng)建的對象,可以在方法調(diào)用結(jié)束之后,繼續(xù)存在于堆中。這帶來的一個問題是,如果我們不斷的創(chuàng)建新的對象,內(nèi)存空間將最終消耗殆盡。

垃圾回收

垃圾回收(garbage collection,簡稱GC)可以自動清空堆中不再使用的對象。垃圾回收機制最早出現(xiàn)于1959年,被用于解決Lisp語言中的問題。垃圾回收是Java的一大特征。并不是所有的語言都有垃圾回收功能。比如在C/C++中,并沒有垃圾回收的機制。程序員需要手動釋放堆中的內(nèi)存。

由于不需要手動釋放內(nèi)存,程序員在編程中也可以減少犯錯的機會。利用垃圾回收,程序員可以避免一些指針和內(nèi)存泄露相關(guān)的bug(這一類bug通常很隱蔽)。但另一方面,垃圾回收需要耗費更多的計算時間。垃圾回收實際上是將原本屬于程序員的責(zé)任轉(zhuǎn)移給計算機。使用垃圾回收的程序需要更長的運行時間。

在Java中,對象的是通過引用使用的(把對象相像成致命的毒物,引用就像是用于提取毒物的鑷子)。如果不再有引用指向?qū)ο?,那么我們就再也無從調(diào)用或者處理該對象。這樣的對象將不可到達(unreachable)。垃圾回收用于釋放不可到達對象所占據(jù)的內(nèi)存。這是垃圾回收的基本原則。

(不可到達對象是死對象,是垃圾回收所要回收的垃圾)

早期的垃圾回收采用引用計數(shù)(reference counting)的機制。每個對象包含一個計數(shù)器。當(dāng)有新的指向該對象的引用時,計數(shù)器加1。當(dāng)引用移除時,計數(shù)器減1。當(dāng)計數(shù)器為0時,認(rèn)為該對象可以進行垃圾回收。

然而,一個可能的問題是,如果有兩個對象循環(huán)引用(cyclic reference),比如兩個對象互相引用,而且此時沒有其它(指向A或者指向B)的引用,我們實際上根本無法通過引用到達這兩個對象。

因此,我們以棧和static數(shù)據(jù)為根(root),從根出發(fā),跟隨所有的引用,就可以找到所有的可到達對象。也就是說,一個可到達對象,一定被根引用,或者被其他可到達對象引用。

分析Java內(nèi)存管理與垃圾回收

橙色,可到達;綠色,不可到達

JVM實施

JVM的垃圾回收是多種機制的混合。JVM會根據(jù)程序運行狀況,自行決定采用哪種垃圾回收。

我們先來了解"mark and sweep"。這種機制下,每個對象將有標(biāo)記信息,用于表示該對象是否可到達。當(dāng)垃圾回收啟動時,Java程序暫停運行。JVM從根出發(fā),找到所有的可到達對象,并標(biāo)記(mark)。隨后,JVM需要掃描整個堆,找到剩余的對象,并清空這些對象所占據(jù)的內(nèi)存。

另一種是"copy and sweep"。這種機制下,堆被分為兩個區(qū)域。對象總存活于兩個區(qū)域中的一個。當(dāng)垃圾回收啟動時,Java程序暫停運行。JVM從根出發(fā),找到可到達對象,將可到達對象復(fù)制到空白區(qū)域中并緊密排列,修改由于對象移動所造成的引用地址的變化。最后,直接清空對象原先存活的整個區(qū)域,使其成為新的空白區(qū)域。

可以看到,"copy and sweep"需要更加復(fù)雜的操作,但也讓對象可以緊密排列,避免"mark and sweep"中可能出現(xiàn)的空隙。在新建對象時,"copy and sweep"可以提供大塊的連續(xù)空間。因此,如果對象都比較"長壽",那么適用于"mark and sweep"。如果對象的"新陳代謝"比較活躍,那么適用于"copy and sweep"。

上面兩種機制是通過分代回收(generational collection)混合在一起的。每個對象記錄有它的世代(generation)信息。所謂的世代,是指該對象所經(jīng)歷的垃圾回收的次數(shù)。世代越久遠的對象,在內(nèi)存中存活的時間越久。

根據(jù)對Java程序的統(tǒng)計觀察,世代越久的對象,越不可能被垃圾回收(富人越富,窮人越窮)。因此,當(dāng)我們在垃圾回收時,要更多關(guān)注那些年輕的對象。

現(xiàn)在,具體看一下JVM中的堆:

分析Java內(nèi)存管理與垃圾回收

我們看到,堆分為三代。其中的永久世代(permanent generation)中存活的是Class對象。這些對象不會被垃圾回收。我們在 RTTI中已經(jīng)了解到,每個Class對象代表一個類,包含有類相關(guān)的數(shù)據(jù)與方法,并提供類定義的代碼。每個對象在創(chuàng)建時,都要參照相應(yīng)的Class對象。每個對象都包含有指向其對應(yīng)Class對象的引用。

年輕世代(young generation)和成熟世代(tenured generation)需要進行垃圾回收。年輕世代中的對象世代較近,而成熟世代中的對象世代較久。

分析Java內(nèi)存管理與垃圾回收

世代

年輕世代進一步分為三個區(qū)域

eden(伊甸): 新生對象存活于該區(qū)域。新生對象指從上次GC后新建的對象。

新生對象生活于伊甸園

from, to: 這兩個區(qū)域大小相等,相當(dāng)于copy and sweep中的兩個區(qū)域。

當(dāng)新建對象無法放入eden區(qū)時,將出發(fā)minor collection。JVM采用copy and sweep的策略,將eden區(qū)與from區(qū)的可到達對象復(fù)制到to區(qū)。經(jīng)過一次垃圾回收,eden區(qū)和from區(qū)清空,to區(qū)中則緊密的存放著存活對象。隨后,from區(qū)成為新的to區(qū), to區(qū)成為新的from區(qū)。

如果進行minor collection的時候,發(fā)現(xiàn)to區(qū)放不下,則將部分對象放入成熟世代。另一方面,即使to區(qū)沒有滿,JVM依然會移動世代足夠久遠的對象到成熟世代。

如果成熟世代放滿對象,無法移入新的對象,那么將觸發(fā)major collection。JVM采用mark and sweep的策略,對成熟世代進行垃圾回收。

到此,關(guān)于“分析Java內(nèi)存管理與垃圾回收”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

當(dāng)前文章:分析Java內(nèi)存管理與垃圾回收
本文路徑:http://jinyejixie.com/article32/iihgsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)做網(wǎng)站、品牌網(wǎng)站建設(shè)企業(yè)網(wǎng)站制作

廣告

聲明:本網(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)

商城網(wǎng)站建設(shè)
瓮安县| 合川市| 平山县| 阳原县| 天峨县| 正镶白旗| 合水县| 吉林市| 湘潭市| 郴州市| 庄浪县| 荔浦县| 南部县| 剑阁县| 确山县| 新安县| 克什克腾旗| 岳阳市| 互助| 怀安县| 康定县| 湖口县| 大城县| 类乌齐县| 沅江市| 堆龙德庆县| 得荣县| 定日县| 扎鲁特旗| 海晏县| 青冈县| 万载县| 兴业县| 西安市| 简阳市| 密云县| 花莲市| 保定市| 奎屯市| 榆林市| 夹江县|