激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 淺談關于Java的GC垃圾回收器的一些基本概念

淺談關于Java的GC垃圾回收器的一些基本概念

2020-03-01 11:26王小明123 JAVA教程

這篇文章主要介紹了關于Java的GC垃圾回收器的一些基本概念,牽扯倒JVM內存模型的一些知識,需要的朋友可以參考下

一、基本回收算法

1. 引用計數(Reference Counting)
比較古老的回收算法。原理是此對象有一個引用,即增加一個計數,刪除一個引用則減少一個計數。垃圾回收時,只用收集計數為0的對象。此算法最致命的是無法處理循環引用的問題。
2. 標記-清除(Mark-Sweep)
此算法執行分兩階段。第一階段從引用根節點開始標記所有被引用的對象,第二階段遍歷整個堆,把未標記的對象清除。此算法需要暫停整個應用,同時,會產生內存碎片。
3. 復制(Copying)
此算法把內存空間劃為兩個相等的區域,每次只使用其中一個區域。垃圾回收時,遍歷當前使用區域,把正在使用中的對象復制到另外一個區域中。次算法每次只處理正在使用中的對象,因此復制成本比較小,同時復制過去以后還能進行相應的內存整理,不過出現“碎片”問題。當然,此算法的缺點也是很明顯的,就是需要兩倍內存空間。
4. 標記-整理(Mark-Compact)
此算法結合了 “標記-清除”和“復制”兩個算法的優點。也是分兩階段,第一階段從根節點開始標記所有被引用對象,第二階段遍歷整個堆,把清除未標記對象并且把存活對象 “壓縮”到堆的其中一塊,按順序排放。此算法避免了“標記-清除”的碎片問題,同時也避免了“復制”算法的空間問題。
5. 增量收集(Incremental Collecting)
實施垃圾回收算法,即:在應用進行的同時進行垃圾回收。不知道什么原因JDK5.0中的收集器沒有使用這種算法的。
6. 分代(Generational Collecting)

基于對對象生命周期分析后得出的垃圾回收算法。把對象分為年青代、年老代、持久代,對不同生命周期的對象使用不同的算法(上述方式中的一個)進行回收。現在的垃圾回收器(從J2SE1.2開始)都是使用此算法的。

1. Young(年輕代)
年輕代分三個區。一個Eden區,兩個 Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被復制到Survivor區(兩個中的一個),當這個 Survivor區滿時,此區的存活對象將被復制到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區復制過來的并且此時還存活的對象,將被復制“年老區(Tenured)”。需要注意,Survivor的兩個區是對稱的,沒先后關系,所以同一個區中可能同時存在從Eden復制過來對象,和從前一個Survivor復制過來的對象,而復制到年老區的只有從第一個Survivor去過來的對象。而且,Survivor區總有一個是空的。
2. Tenured(年老代)
年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。
3. Perm(持久代)
用于存放靜態文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=<N>進行設置。


二、GC類型
GC有兩種類型:Scavenge GC和Full GC。

1. Scavenge GC
一般情況下,當新對象生成,并且在Eden申請空間失敗時,就好觸發Scavenge GC,堆Eden區域進行GC,清除非存活對象,并且把尚且存活的對象移動到Survivor區。然后整理Survivor的兩個區。
2. Full GC
對整個堆進行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此應該盡可能減少Full GC。有如下原因可能導致Full GC:
* Tenured被寫滿
* Perm域被寫滿
* System.gc()被顯示調用
* 上一次GC之后Heap的各域分配策略動態變化


分代垃圾回收過程演示

 1.
<!--StartFragment -->  

淺談關于Java的GC垃圾回收器的一些基本概念

 2.

淺談關于Java的GC垃圾回收器的一些基本概念

 3.

淺談關于Java的GC垃圾回收器的一些基本概念

 4.

淺談關于Java的GC垃圾回收器的一些基本概念

二、垃圾回收器


目前的收集器主要有三種:串行收集器、并行收集器、并發收集器。

1. 串行收集器

使用單線程處理所有垃圾回收工作,因為無需多線程交互,所以效率比較高。但是,也無法使用多處理器的優勢,所以此收集器適合單處理器機器。當然,此收集器也可以用在小數據量(100M左右)情況下的多處理器機器上。可以使用-XX:+UseSerialGC打開。

2. 并行收集器
1. 對年輕代進行并行垃圾回收,因此可以減少垃圾回收時間。一般在多線程多處理器機器上使用。使用-XX:+UseParallelGC.打開。并行收集器在J2SE5.0第六6更新上引入,在Java SE6.0中進行了增強--可以堆年老代進行并行收集。如果年老代不使用并發收集的話,是使用單線程進行垃圾回收,因此會制約擴展能力。使用-XX:+UseParallelOldGC打開。
2. 使用-XX:ParallelGCThreads=<N>設置并行垃圾回收的線程數。此值可以設置與機器處理器數量相等。
3. 此收集器可以進行如下配置:
* 最大垃圾回收暫停:指定垃圾回收時的最長暫停時間,通過-XX:MaxGCPauseMillis=<N>指定。<N>為毫秒.如果指定了此值的話,堆大小和垃圾回收相關參數會進行調整以達到指定值。設定此值可能會減少應用的吞吐量。
* 吞吐量:吞吐量為垃圾回收時間與非垃圾回收時間的比值,通過-XX:GCTimeRatio=<N>來設定,公式為1/(1+N)。例如,-XX:GCTimeRatio=19時,表示5%的時間用于垃圾回收。默認情況為99,即1%的時間用于垃圾回收。

3. 并發收集器
可以保證大部分工作都并發進行(應用不停止),垃圾回收只暫停很少的時間,此收集器適合對響應時間要求比較高的中、大規模應用。使用-XX:+UseConcMarkSweepGC打開。
1. 并發收集器主要減少年老代的暫停時間,他在應用不停止的情況下使用獨立的垃圾回收線程,跟蹤可達對象。在每個年老代垃圾回收周期中,在收集初期并發收集器會對整個應用進行簡短的暫停,在收集中還會再暫停一次。第二次暫停會比第一次稍長,在此過程中多個線程同時進行垃圾回收工作。
2. 并發收集器使用處理器換來短暫的停頓時間。在一個N個處理器的系統上,并發收集部分使用K/N個可用處理器進行回收,一般情況下1<=K<=N/4。
3. 在只有一個處理器的主機上使用并發收集器,設置為incremental mode模式也可獲得較短的停頓時間。
4. 浮動垃圾:由于在應用運行的同時進行垃圾回收,所以有些垃圾可能在垃圾回收進行完成時產生,這樣就造成了“Floating Garbage”,這些垃圾需要在下次垃圾回收周期時才能回收掉。所以,并發收集器一般需要20%的預留空間用于這些浮動垃圾。
5. Concurrent Mode Failure:并發收集器在應用運行時進行收集,所以需要保證堆在垃圾回收的這段時間有足夠的空間供程序使用,否則,垃圾回收還未完成,堆空間先滿了。這種情況下將會發生“并發模式失敗”,此時整個應用將會暫停,進行垃圾回收。
6. 啟動并發收集器:因為并發收集在應用運行時進行收集,所以必須保證收集完成之前有足夠的內存空間供程序使用,否則會出現“Concurrent Mode Failure”。通過設置-XX:CMSInitiatingOccupancyFraction=<N>指定還有多少剩余堆時開始執行并發收集

4. 小結
* 串行處理器:
--適用情況:數據量比較小(100M左右);單處理器下并且對響應時間無要求的應用。
--缺點:只能用于小型應用
* 并行處理器:
--適用情況:“對吞吐量有高要求”,多CPU、對應用響應時間無要求的中、大型應用。舉例:后臺處理、科學計算。
--缺點:應用響應時間可能較長
* 并發處理器:
--適用情況:“對響應時間有高要求”,多CPU、對應用響應時間有較高要求的中、大型應用。舉例:Web服務器/應用服務器、電信交換、集成開發環境。

三、GC基本原理
GC(Garbage Collection),是JAVA/.NET中的垃圾收集器。
Java是由C++發展來的,它擯棄了C++中一些繁瑣容易出錯的東西,引入了計數器的概念,其中有一條就是這個GC機制(C#借鑒了JAVA)
編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。所以,Java的內存管理實際上就是對象的管理,其中包括對象的分配和釋放。
對于程序員來說,分配對象使用new關鍵字;釋放對象時,只要將對象所有引用賦值為null,讓程序不能夠再訪問到這個對象,我們稱該對象為"不可達的".GC將負責回收所有"不可達"對象的內存空間。
對于GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的".當GC確定一些對象為"不可達"時,GC就有責任回收這些內存空間。但是,為了保證 GC能夠在不同平臺實現的問題,Java規范對GC的很多行為都沒有進行嚴格的規定。例如,對于采用什么類型的回收算法、什么時候進行回收等重要問題都沒有明確的規定。因此,不同的JVM的實現者往往有不同的實現算法。這也給Java程序員的開發帶來行多不確定性。本文研究了幾個與GC工作相關的問題,努力減少這種不確定性給Java程序帶來的負面影響。

四、GC分代劃分
JVM內存模型中Heap區分兩大塊,一塊是 Young Generation,另一塊是Old Generation

淺談關于Java的GC垃圾回收器的一些基本概念

1) 在Young Generation中,有一個叫Eden Space的空間,主要是用來存放新生的對象,還有兩個Survivor Spaces(from、to),它們的大小總是一樣,它們用來存放每次垃圾回收后存活下來的對象。
2) 在Old Generation中,主要存放應用程序中生命周期長的內存對象。
3) 在Young Generation塊中,垃圾回收一般用Copying的算法,速度快。每次GC的時候,存活下來的對象首先由Eden拷貝到某個SurvivorSpace,當Survivor Space空間滿了后,剩下的live對象就被直接拷貝到OldGeneration中去。因此,每次GC后,Eden內存塊會被清空。
4) 在Old Generation塊中,垃圾回收一般用mark-compact的算法,速度慢些,但減少內存要求。
5) 垃圾回收分多級,0級為全部(Full)的垃圾回收,會回收OLD段中的垃圾;1級或以上為部分垃圾回收,只會回收Young中的垃圾,內存溢出通常發生于OLD段或Perm段垃圾回收后,仍然無內存空間容納新的Java對象的情況。

五、增量式GC
增量式GC(Incremental GC),是GC在JVM中通常是由一個或一組進程來實現的,它本身也和用戶程序一樣占用heap空間,運行時也占用CPU。
當GC進程運行時,應用程序停止運行。因此,當GC運行時間較長時,用戶能夠感到Java程序的停頓,另外一方面,如果GC運行時間太短,則可能對象回收率太低,這意味著還有很多應該回收的對象沒有被回收,仍然占用大量內存。因此,在設計GC的時候,就必須在停頓時間和回收率之間進行權衡。一個好的GC實現允許用戶定義自己所需要的設置,例如有些內存有限的設備,對內存的使用量非常敏感,希望GC能夠準確的回收內存,它并不在意程序速度的快慢。另外一些實時網絡游戲,就不能夠允許程序有長時間的中斷。
增量式GC就是通過一定的回收算法,把一個長時間的中斷,劃分為很多個小的中斷,通過這種方式減少GC對用戶程序的影響。雖然,增量式GC在整體性能上可能不如普通GC的效率高,但是它能夠減少程序的最長停頓時間。
Sun JDK提供的HotSpot JVM就能支持增量式GC。HotSpot JVM缺省GC方式為不使用增量GC,為了啟動增量GC,我們必須在運行Java程序時增加-Xincgc的參數。
HotSpot JVM增量式GC的實現是采用Train GC算法,它的基本想法就是:將堆中的所有對象按照創建和使用情況進行分組(分層),將使用頻繁高和具有相關性的對象放在一隊中,隨著程序的運行,不斷對組進行調整。當GC運行時,它總是先回收最老的(最近很少訪問的)的對象,如果整組都為可回收對象,GC將整組回收。這樣,每次GC運行只回收一定比例的不可達對象,保證程序的順暢運行。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品爆操 | 成人毛片av在线 | 操你逼 | 黄色网址免费在线播放 | 欧美淫视频 | 欧美一区二区三区中文字幕 | 精品一区在线视频 | 外国一级黄色片 | 黄色免费播放网站 | 粉嫩粉嫩一区二区三区在线播放 | 91在线视频福利 | 久久九九热re6这里有精品 | 一级空姐毛片 | 亚洲国产精品久久久久久久久久 | 国产在线1区| 伊人yinren22综合网色 | 亚洲午夜激情网 | 欧日一级片 | 久草亚洲视频 | freexxxx性女hd性吃奶 | 最新欧美精品一区二区三区 | 国产一级毛片高清视频 | 72pao成人国产永久免费视频 | 免费观看黄色一级视频 | 国产精品剧情一区二区三区 | 国产精品自拍99 | 成人毛片网 | 久久网国产 | 操操日日 | 香蕉久久久 | 国产高潮失禁喷水爽到抽搐视频 | 九一国产精品 | 日本在线播放一区二区三区 | 国产精品麻豆91 | 久章草影院 | 中文字幕极速在线观看 | 亚洲综合视频网 | 亚洲一区在线观看视频 | 99影视在线视频免费观看 | 国产中出视频 | 一边吃奶一边摸下娇喘 |