国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JVM探索之內存管理(三)

2019-11-14 21:49:34
字體:
來源:轉載
供稿:網友
JVM探索之內存管理(三)

上節我們介紹了JVM垃圾回收的原則,還有幾個垃圾收集算法:標記-清除算法、復制算法、標記整理算法、分代收集算法;現在將要說HotSpt的垃圾收集器,這小節將只是理論。

java虛擬機規范對垃圾收集器的具體實現并沒有任何規定,所以不同廠商、不同版本的虛擬機提供的垃圾收集器會有很大的不同。下面所介紹的收集器只是HotSpt1.7的垃圾收集器。

HotSpot堆的瓜分

HotSpt它把內存空間分為幾個區域:新生代、老年代、永久代;上節中也說到了分代垃圾收集算法的主要思想按對象的生命周期來進行分組;

如上圖JVM把堆劃分為Young、Old、Perm三大區域,對應著不能年齡的對象;然后又把Young分為:Eden、Survivor From、Survivor To三小塊;各個區域存放對象的區別如下:

  • Young區,所有新創建的對象都存儲在Eden區域中,當Eden滿后將會觸發minor GC把Eden中存活的對象復制到一個Survivor中,然后另一個Survivor存活對象也復制到這個中,始終保持一個Survivor區域為空的。
  • Old區存放的是Survivor滿后觸發minor GC后依然存活的對象,如果從Eden復制到Survivor的對象存不了也可以直接存到Old區中等。Old區滿了就會觸發Full GC回收整個堆內存。
  • Perm區存儲類、方法、等的元信息,Perm也會觸發Full GC進行垃圾回收。

Sun有對各個區域給出建議的大小,Young區域為整個堆的1/4,Young中的Survivor為Young區域的1/8,安裝JDK的時候有自帶了visualvm工具,可以安裝Visual GC插件來查看到JVM各個區域的垃圾回收情況,可以看到內存大小、GC時間、已使用大小、剩余大小等等信息如圖:

垃圾收集器

HotSpot提供了七種類垃圾收集器:Serial 收集器、ParNew 收集器、Parallel Scavenge收集器、Serial Old收集器、Parallel Old 收集器、CMS 收集器、G1 收集器。

Serial 收集器是比較古老的一種收集器,不過到現在他還是JVM client模式中默認新生代的GC算法, Serial是單線程的,它在進行垃圾回收工作時會暫停所有其他工作,Sum稱為:“Stop The World”,直到回收任務結束,然后Serial工作時占用的時間比較多但它比較簡單新生代內存不大的情況下回收工作時間還是短到可以接收的,基本一秒以內。

ParNew 收集器與Serial Collector唯一不同的就是Serial Collector是單線程的,ParNew Collector是多線程的,ParNew Collector是JVM Server模式中默認的新生代GC算法。

Parallel Scavenge收集器 也是新生代收集算法,使用復制算法、并行的多線程,它的優勢在于提高吞吐量,GC停頓的時間越短吞吐量就會越高,

Serial Old收集器為Serial的老年代版本,單線程、“標記-整理”算法,在Client模式下為虛擬機使用。

Parallel Old 收集器為Parallel Scavenge的老年代版本,使用多線程、“標記-清除算法”,

CMS(Concurrent Mark Sweep收集器是以最短停頓時間為目標的收集器,使用了“標記清除”算法實現,不過這個收集器比前面幾個收集器都要復雜,運作過程有這么幾個步驟:

1、 初始標記(CMS initial mark)

2、 并發標記(CMS concurrent mark)

3、 重新標記(CMS remark)

4、 并發清除(CMS concurrent sweep)

在初始標記、重新標記的時候會“Stop The World”,初始標記標記出GC Roots能直接關聯到的對象,并發標記進行GC Roots Tracing,重新標記修復在程序繼續運行導致標記的變動,CMS也有不好的地方就是CMS會占用較多的CPU由于CMS是使用標記清除算法實現的,所以可能會導致較多的碎片。

G1收集器JDK1.7發布的時候才退出的算法,可以說是比較新的技術,相比CMS G1不會產生碎片,因為他使用的是“標記-整理”算法,G1還有就是能比較精確的空間停頓時間可以在不犧牲吞吐量的情況下進行垃圾回收,G1把整個Java堆(新生代、老年代)瓜分為多個獨立區域,跟蹤這些區域的垃圾堆積程度,然后維護一個優先列表,根據允許的時間優先回收垃圾最多的區域。

內存分配策略

內存的分配規則不是百分之百固定的,它取決與虛擬機的相關參數配置還有使用的垃圾收集器組合。這里說的只是最普遍的內存分配規則,這里只是說些理論,在下篇文章將會用代碼去驗證。

Eden優先分配

絕大多數情況下對象創建的時候在Eden區域分配,當分配的時候Eden中空間不足時將觸發Minor GC,

較大對象直接進入老年代

較大對象:需要使用大量連續的內存空間的Java對象,常見的有:很長的字符串、數組,寫代碼的時候能避免盡量避免短命較大對象,因為大對象常常會引發GC。

生命周期較長的對象進入老年代

分代垃圾收集的思想就是按對象的生命周期來分開管理,虛擬機為每個對象定義了一個對象年齡計數器,對象在Eden區中經過一次Minor GC后仍存活并復制到Survivor中,對象年齡就為1,對象每在Survivor中度過一次Minor GC年齡將加1,當年齡到一定值(默認15)的時候對象將晉升到老年代。閥值可以通過參數設置,后面將介紹到。

動態年齡判定

虛擬機并不定死說必須達到MaxTenuringThreshold年齡才能晉升老年代;如在Survivor空間中相同年齡所有對象大小總和大于Survivor空間的一半,大于或等于該年齡的對象就可以直接進入老年代中,無需等到指定的年齡。

空間擔保分配

年輕代在發生Minor GC時,虛擬機會檢測每次晉升到老年代的平均大小是否大于老年代剩余的存儲空間,比老年代剩余空間大則改為直接Full GC,如果小,則看HandlePRomotionFailure設置是否允許擔保失敗,是則只會進行Minor GC,否則也要改為進行一次Full GC。

文章首發地址:Solinx

http://www.solinx.co/archives/58


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苍山县| 区。| 高雄县| 武陟县| 理塘县| 霸州市| 桑日县| 河北省| 香格里拉县| 陆丰市| 高邮市| 普兰县| 宣威市| 天津市| 苗栗县| 达孜县| 洞头县| 正宁县| 石门县| 北碚区| 景德镇市| 三门县| 榆中县| 岳西县| 衡阳县| 华宁县| 安多县| 西乡县| 新疆| 泸定县| 景宁| 成都市| 湘潭市| 房山区| 镇雄县| 外汇| 穆棱市| 上蔡县| 雷州市| 仙游县| 卫辉市|