亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java進階 ---- 內存管理與垃圾回收

2019-11-06 06:57:27
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

Java是在JVM所虛擬出的內存環境中運行的。內存分為棧(stack)和堆(heap)兩部分。我們將分別考察這兩個區域。

棧的基本概念參考紙上談兵: 棧 (stack)。許多語言利用棧數據結構來記錄函數調用的次序和相關變量(參考linux從程序到進程)。

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

 

調用棧

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

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

 

引用與對象

當被調用方法運行結束時,該方法對應的幀將被刪除,參數和局部變量所占據的空間也隨之釋放。線程回到原方法,繼續執行。當所有的棧都清空時,程序也隨之運行結束。

如上所述,棧(stack)可以自己照顧自己。但堆必須要小心對待。堆是JVM中一塊可自由分配給對象的區域。當我們談論垃圾回收(garbage collection)時,我們主要回收堆(heap)的空間。

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

 

垃圾回收

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

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

 

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

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

 

 

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

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

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

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

 

JVM實施

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

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

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

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

 

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

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

 

現在,具體看一下JVM中的堆:

 

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

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

世代

年輕世代進一步分為三個區域

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

新生對象生活于伊甸園

from, to: 這兩個區域大小相等,相當于copy and sweep中的兩個區域。

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

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

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

 

總結

以上是對JVM內存管理的一個概述。實際上,JVM擁有眾多版本。不同版本實施的GC機制會有不小的差異。另一方面,Java本身并沒有規定JVM的GC實施方式。GC依然是JVM發展的一個熱點方向。我們可以預期JVM的GC機制在未來會發生許多變化。

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文有码在线视频| 国产精品永久免费观看| 中文字幕欧美日韩精品| 欧美壮男野外gaytube| 日韩在线国产精品| 国产主播喷水一区二区| 久久亚洲影音av资源网| 欧美成人精品三级在线观看| 日韩av手机在线看| 国产一区二区三区在线视频| 国产精品高潮呻吟久久av黑人| 97涩涩爰在线观看亚洲| 668精品在线视频| 伊人久久大香线蕉av一区二区| 国产成人综合亚洲| 日韩av一区在线观看| 欧美日韩国产影院| 这里精品视频免费| yellow中文字幕久久| 一道本无吗dⅴd在线播放一区| 国产欧美精品一区二区三区-老狼| 欧美视频专区一二在线观看| 97在线观看免费高清| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久91亚洲人成电影网站| 亚洲男人第一网站| 久久6免费高清热精品| 国产午夜精品久久久| 欧美韩国理论所午夜片917电影| 91高清免费视频| 亚洲在线视频观看| 国产精品视频白浆免费视频| 国产精品久久久久9999| 国产精品黄视频| 日韩欧美国产免费播放| 欧美电影免费观看| 欧美激情高清视频| 欧美日韩激情小视频| 亚洲精品视频在线播放| 国产视频精品免费播放| 欧美激情乱人伦| 亚洲免费一在线| 欧美精品videossex88| 久久精品成人一区二区三区| 在线播放日韩精品| 91久久久久久久久久久久久| 成人在线一区二区| 欧美成人免费全部| 国产精品福利无圣光在线一区| 国产日韩精品一区二区| 成人两性免费视频| 成人中文字幕在线观看| 国产精品久久久久久久久免费| 亚洲国产一区自拍| 伊人亚洲福利一区二区三区| 日韩亚洲成人av在线| 欧美激情2020午夜免费观看| 最新中文字幕亚洲| 久久综合免费视频影院| 国产精品三级久久久久久电影| 成人黄色av播放免费| 久久久精品在线观看| 91免费的视频在线播放| 九九热视频这里只有精品| 久久97精品久久久久久久不卡| 欧美丰满老妇厨房牲生活| 国产精品香蕉国产| 久久久久久国产精品三级玉女聊斋| 欧美天天综合色影久久精品| 久久久视频免费观看| 欧美精品一区二区免费| 一本色道久久88亚洲综合88| 日韩在线视频线视频免费网站| 欧美激情一级精品国产| 国产亚洲免费的视频看| 欧美在线性视频| 97**国产露脸精品国产| 91高清视频在线免费观看| 亚洲国产欧美自拍| 91在线色戒在线| 日韩欧美国产视频| 日韩电视剧在线观看免费网站| 国产精品jvid在线观看蜜臀| 国产成人亚洲综合91| 91精品免费视频| 91av视频在线播放| 日本一区二区三区在线播放| 日韩中文字幕视频在线| 亚洲国产小视频| 深夜精品寂寞黄网站在线观看| 国产精品第8页| 国产日韩在线一区| 国产精品一区电影| 国产97免费视| 日本精品一区二区三区在线| 欧美日韩精品二区| 在线视频精品一| 成人激情免费在线| 亚洲综合在线中文字幕| 国产欧美日韩免费| 亚洲一区精品电影| 欧美黑人狂野猛交老妇| 日韩av一区在线| 久久中文字幕在线| 精品激情国产视频| 91精品啪aⅴ在线观看国产| 亚洲精品影视在线观看| 在线观看91久久久久久| 亚洲毛片在线观看| 日韩av在线免费播放| 国产在线视频一区| 国产精品成人在线| 日韩亚洲在线观看| 久久韩剧网电视剧| 久久久久久久91| 亚洲一区二区三区视频| 中文字幕在线看视频国产欧美在线看完整| 亚洲剧情一区二区| 久久91亚洲精品中文字幕奶水| 在线播放国产精品| 国产日韩欧美夫妻视频在线观看| 欧美黄色免费网站| 在线一区二区日韩| 亚洲欧美国产另类| 午夜精品一区二区三区在线视频| 欧美亚洲视频一区二区| 在线观看日韩专区| www.日韩免费| 国产一区二区香蕉| 国产精品视频男人的天堂| 午夜精品久久17c| 久久这里只有精品视频首页| 国产一区二区三区视频免费| 日本国产欧美一区二区三区| 永久免费精品影视网站| 国语对白做受69| 久久久国产精彩视频美女艺术照福利| 亚洲香蕉成视频在线观看| 狠狠久久亚洲欧美专区| 午夜精品国产精品大乳美女| 人人做人人澡人人爽欧美| 亚洲欧美一区二区三区四区| 91麻豆国产语对白在线观看| 日韩美女视频在线观看| 国产日韩欧美中文在线播放| 欧美激情免费在线| 红桃视频成人在线观看| 国产成人久久久| 国产99久久精品一区二区| 九九精品在线观看| 久久精品成人一区二区三区| 国产亚洲精品一区二区| 国产精品夜色7777狼人| 久久69精品久久久久久国产越南| 一区二区三区日韩在线| 午夜精品美女自拍福到在线| 不卡在线观看电视剧完整版| 欧美极品少妇全裸体| 中日韩美女免费视频网站在线观看| 久久久久久久999精品视频| 欧美日韩午夜视频在线观看| 国产精品中文字幕在线| 91精品久久久久久久久| 午夜精品久久久久久99热软件|