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

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

深入理解java虛擬機-第三章

2019-11-14 22:05:52
字體:
來源:轉載
供稿:網友
深入理解java虛擬機-第三章

1、概述

2、對象已死嗎?

引用計數器

  給對象添加一個引用計數器,每當有引用時,計數器加1,引用失效時,計數器減1;任何時刻計數器為0的對象就是不可能再被使用的。

  若對象是循環引用,則無法處理。JVM不使用。

可達性分析算法

  通過一系列的稱為“GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索所經過的路徑稱為引用鏈(Reference Chain),當一個對象沒有任何引用鏈相連時,表明該對象不可用。

  Java語言中,可作為 GC Roots的對象包括如下:

    虛擬機棧(棧幀中的本地變量表)中引用的對象。

    方法區中類靜態屬性引用的對象。

    方法區中常量引用的對象。

    本地方法棧中JNI(即一般說的Native方法)引用的對象。

Java中的引用:

  強引用(Strong Reference) 類似“Object obj=new Object()”,這類的引用,只要強引用還存在,對象永遠不會被回收。

  軟引用(Soft Reference)用來描述一些還有用但并非必需的對象。在系統將要發生內存溢出前,會對這類對象進行回收;如果這次回收還沒有足夠的內存,才會拋出內存溢出異常。SoftReference類來實現。

  弱引用(Weak Reference) 非必需的對象,但強度比軟引用更弱一點。當垃圾收集器工作時,無論內存是否夠用,都會回收這類引用。WeakReference來實現。

  虛引用(Phantom Reference)幽靈引用或幻影引用,最弱的一種引用關系,完全不對其生存時間構成影響,也無法通過虛引用來取得一個對象實例,唯一目的就是能在這個對象被收集器回收時收到一個系統通知,用PhantomReference來實現

3、垃圾收集算法

標記清除算法 Mark-Sweep

  首先標記出所要回收的對象,在標記完成后統一回收所有被標記的對象??赡軙斐伤槠?。

復制算法Copying

  將可用內存按容量劃分為大小相等的兩塊,每次中使用其中的一塊,當這一塊用完了,將存活的對象復制到另一塊中,然后把已使用的一塊清空。

    每次對整個半區進行內存回收,也不用考慮內存d碎片;代價為只使用了內存的一半。

  現在商業虛擬機都使用這種算法來回收 新生代,不過將內存分為較大的Eden和兩塊較小的Survior,每次只使用Eden和一塊Survior,回收時一次復制到另一塊Survivor,默認比例8:1:1.

標記-整理算法

  與 標記-清除算法一樣,但是后續步驟是讓所有存活的對象都向一端移動,最后直接清理掉端邊界以外的內存。

分代收集算法 Generation Collection

  根據對象存活周期的不同將內存劃分為幾塊

默認的,新生代與老年代的比例值為1:2(可以通過參數-XX:NewRatio來指定

Eden:from:to=8:1:1可以通過--XX:SurvivorRatio來指定

4、HotSpot的算法實現

枚舉根結點

  從可達性分析中從GC Root節點找引用鏈的操作中,需要停頓所有Java執行線程(Stop The World, STW)。HotSpot的實現中使用一組稱為OopMap的數據結構來實現,當執行系統停頓下來后,并不需要一個不漏的檢查所有執行上下文和全局的引用位置。

安全點

安全區域

5、垃圾收集器

Serial收集器

  單線程的收集器,必需暫停其他所有的工作線程,簡單而高效。

ParNew

  Serial的多線程版本,暫停其它工作線程,啟用多個回收線程來回收。

Parallel Scavenge收集器

  目標是達到一個可控制的吞吐量,吞吐量就是Cpu運行用戶代碼的時間和CPU總消耗時間的比值。

Serial Old收集器

  Serial收集器的老年代版本。

Parallel Old收集器

  老年代的Parallel Scavenge收集器,使用多線程和“標記-整理”算法。

CMS收集器 Concurrent Mark Sweep

  以獲取最短回收停頓時間為目標的收集器

    初始標記 (CMS initial mark), Stop the World,只是標記一下GC Roots能直接關聯到的對象,速度很快

    并發標記(CMS concurrent mark),進行GC Roots Tracing的過程。

    重新標記(CMS remark), Stop the World, 為了修正并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄

    并發清除(CMS concurrent sweep)

G1收集器 Garbage-first

  面向服務端應用的垃圾收集器

  1、并發與關行。 充用利用多CPU、多核環境下的硬件優勢,來縮短Stop-The-World從停頓的時間,可以通過并發的文萃上java程序繼續執行

  2、分代收集。 分不同的方式去處理新創建的對象和已經存活了一段時間、熬過多次GC的舊對象

  3、空間整合。從整體來看是基于“標記-整理”算法的收集器,從局部上來看是基于“復制”算法實現的, 運行期間不會產生內存碎片,收集后能提供規整的可用內存。

  4、可預測的停頓

Young Generation: Serial、ParNew、Parallel Scavenge、G1

Tenured(old) Generation:CMS、Serial Old、Parallel Old

6、內存分配和回收策略

  對象優先在Eden分配,當Eden區沒有足夠空間分分配時,觸發一次GC

  大對象直接進入老年代

  長期存活的對象進行老年代

    虛擬機給每個對象定義了一個對象年齡計數器,如果對象在Eden出生并經過第一次MinorGC后仍然存活,并且能被Survior容納的話,將被移動到Survivor空間中,并且對象年齡為1.

    對象在Survivor中每一次Minor GC,年齡增加1,當年齡增加到一定程序,就晉升老年代

   動態對象年齡判定

    為了更好地適應不同程序的內存狀態,如果在Survivor空間中相同年齡所有對象大小的總和大于Survivorp空間的一半,年齡大于或等于該年齡的對象可以直接進入老年代

  空間分配擔保


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东海县| 宁晋县| 棋牌| 德保县| 聊城市| 南和县| 邯郸市| 宝兴县| 永寿县| 化隆| 廉江市| 缙云县| 铜山县| 庆元县| 额敏县| 阿坝县| 蓬莱市| 元江| 剑阁县| 蛟河市| 四会市| 株洲县| 朝阳市| 安溪县| 从化市| 东城区| 柳河县| 寿阳县| 武安市| 德令哈市| 临泽县| 深泽县| 英超| 天峻县| 冷水江市| 类乌齐县| 正阳县| 东兴市| 应城市| 通河县| 衡山县|