国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

《深入理解Java虛擬機第3版》垃圾收集器與內存分配策略、虛擬機性能監控故障處理工具

Kerr1Gan / 2997人閱讀

摘要:目錄往期博客課堂篇初識常量池簡單理解字符串常量池靜態常量池大整型常量池為什么要了解垃圾收集和內存分配如何判斷對象已死引用計數算法可達性分析算法之后引用的擴充回收方法區垃圾收集算法分代收集理論標記清除標記復制標記整理對象分

目錄


  1. 為什么要了解垃圾收集和內存分配?
  2. 如何判斷對象已死?
    • 引用計數算法
    • 可達性分析算法
    • JDK1.2之后引用的擴充
  3. 回收方法區
  4. 垃圾收集算法分代收集理論
    • 標記清除
    • 標記復制
    • 標記整理
  5. 對象分配
  6. 虛擬機性能監控故障處理工具

1、為什么需要了解垃圾收集和內存分配?

當需要排查各種內存溢出、內存泄露問題時,當垃圾收集成為系統達到高并發量的瓶頸時,我們必須對這些“自動化”的技術實

施必要的監控和調節。

2、如何判斷對象已死?

2.1、引用計數法

  • 在對象中添加一個引用計數器,每當有一個地方引用它時,計數器值就加1,當有一個地方取消引用它時,計數器值減1
  • 雖然額外占用內存空間,但是他的原理簡單,判定效率也很高
  • Java領域主流的虛擬機未采用沒有選擇用,因為這個看似簡單的算法有很多例外的情況要考慮,必須配合額外的大量處理才能確保正確工作,如單純的引用計數很難解決對象之間的互相引用問題。

2.2、可達性分析

  • 通過一系列的GC Roots的根對象作為起始點集,從這些結點開始,根據引用關系向下搜索,搜索走過的路徑稱為引用鏈,如果某個對象到GC Roots間沒有任何引用鏈相連,或者用圖論的話來說就是不可達,證明這個對象不再被使用
  • 固定可以作為GC Roots的對象包括:
    • 虛擬機棧引用的對象(方法參數、局部變量、臨時變量)
    • 方法區的靜態屬性引用的對象
    • 方法區的常量池引用的對象
    • 本地方法棧Native方法引用的對象
    • 虛擬機內部的引用
    • 同步鎖synchrionized持有的對象

2.3、JDK1.2之后引用的擴充

四種新擴充的引用

  • 強引用:傳統的"引用"定義如Object o = new Object(),只要強引用的關系還在,垃圾收集器就永遠不會回收掉被引用的對象
  • 軟引用:描述還有用,但是非必須的對象,在系統將要發生內存溢出異常前,會把這些對象列入回收范圍之中進行二次回收,如果回收之后還是內存不夠,就會拋出異常。JDK1.2版之后提供了SftReference類來實現軟引用
  • 弱引用:也是描述那些非必須的對象,但是它的強度比弱引用更弱一些,被弱引用引用的·對象只能生存到下一次垃圾收集發生為止。
  • 虛引用:不對對象存活造成影響,位一各對象設置虛引用的目的只是為了垃圾收集器回收該對象時收到有個系統通知。

3、回收方法區

  • 相比于堆內存的回收,方法區的回收由于苛刻的回收條件,其區域垃圾收集的成果往往很低
  • 方法區的垃圾收集主要涉及兩部分的內容:
    • 廢棄的常量:字符串常量池里面的常量等
    • 不在使用的類型:類、接口、方法、字段的符號引用等
  • 判斷一個類不在使用需要考慮
    • 該類的所有實例都已經被回收
    • 加載該類的類加載器已經被回收
    • 該類對java.lang.Class對象沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法
  • 在大量使用反射、動態代理、CGLIB等字節碼的框架,動態生成JSP等這類頻繁自定義類加載器的場景,通常都需要Java虛擬機具備類型卸載的能力,以保證不會對方法區造成過大的內存壓力。

4、垃圾收集算法

垃圾收集算法可以劃分為

  • 引用計數式垃圾收集(對應前面的 引用計數算法)
  • 追蹤式垃圾收集(對用前面的 可達性分析算法)

分代收集設計原則

  • 弱分代假說:任何對象都是朝生夕滅
  • 強分代假說:熬過越多次垃圾收集的對象就越難消亡

因此存在

  • 部分收集Partical GC
    • 新生代收集Young GC
    • 老年代收集Old GC
    • 混合收集Mixed GC
  • 整堆收集Full GC

4.1、標記清除算法

算法分為 標記 和 清除 兩個階段

  • 標記:首先標記出所有要回收的對象(或者存活的對象),在標記完成后
  • 清除:統一回收掉被標記的對象

缺點

  • 執行效率不太穩定:如果Java堆中包含大量對象,而且其中大部分都是需要回收的,這時需要大量標記和清除操作
  • 內存空間碎片化問題:清除之后,產生大量不連續的內存空間,當需要分配大對象是,有可能放不下還需要進行一次GC

4.2、標記復制算法

相比標記清除算法

  • 半區復制:將內存容量劃分為大小相等的兩塊,每次只使用其中的一塊,當這一塊內存用完了,就還將存活的對象復制到另外一塊,再把使用過的一塊內存全部回收清理。
  • 缺點:這種算法產生大量的內存空間復制的開銷,可用內存縮小為原來的一半,空間浪費。

半區復制分代策略

  • Appel式回收:虛擬機的新生代使用此種回收算法,將新生代分為 Eden和Survivor區域,比例為8:1:1;每次將Eden的存活對象放到Survivor中
  • 需要老年代內存擔保,也就是Survivor需要像老年代傳送對象。

4.3、標記整理算法

相比于新生代使用標記復制算法、標記清除算法

  • 老年代不能使用標記復制算法,因為老年代對象存活率高,進行復制會浪費內存空間
  • 針對老年代對象的死亡特征,需要使用標記-整理算法,區別于標記-清除算法本質區別就是 不是直接對可回收對象清理,而是將存活的對象往一段移動,清除邊界以外的內存。

特點

  • 移動存活對象的·時候,尤其是老年代,移動對象地址需要全部用戶程序才能進行Stop The World
  • 不移動時候采用標記清除算法,內存分配復雜
  • 移動的時候采用標記整理算法,回收時更復雜
  • 有一種和稀泥方式,碎片化程度到達一定程度開啟移動

5、對象分配

對象的內存分配從概念上講都是堆上分配,(實際可能有即時編譯后被拆散為標量類型并間接的在棧上分配),在經典分代的設計下,新生對象會直接分布在新生代,一些超過閾值的大對象可以直接分布在老年代

  • 對象優先在Eden分配:沒有足夠空間會觸發YoungGC,存活的對象會進入Survivor
  • 大對象直接進入老年代:為了避免大對象內存復制的開銷,直接將大對象分配到老年代,通過設置-XX:PretenureSizeThreshold=3145728參數指定閾值
  • 長期存活的對象進入老年代:虛擬機給每個對象定義了一個對象年齡(Age)計數器存儲在對象頭中,對象通常在Eden單上,如果第一次經理YongGC能夠存活下來并且Survivor能夠放的下,該對象就會被移動到Survivor并且年齡加1歲,當年齡增加到一定程度(默認15歲)就會被放到年代。可以通過-XXMaxTenuringThreshold設置
  • 動態對象年齡判斷:除了對象年齡增長進入老年代,如果Survivor空間相同年齡的對象綜合大于Survivor空間的一半,年齡大于等于該年齡的對象可以直接進入老年。
  • 空間分配擔保:在發生YoungGC的時候,虛擬機必須先檢查老年代最大可用的連續空間是否大于新生代所有對象的總空間,
    • 如果這個條件成立,那么這一次GC是確保安全的
    • 如果這個條件不成立,則虛擬機會檢查參數-XX:HandlePromotionFailure參數是否允許擔保失敗,如果允許,則會檢查老年代可用連續空間是否大于歷屆上升到老年代對象年齡的平均大小
      • 如果大于,進行一次YoungGC
      • 如果小于,或者是-XX:handlePromotionFailure設置不允許冒險,這時候就需要進行一次FullGC

6、虛擬機性能監控故障處理工具

6.1基礎故障處理工具

  • jsp:虛擬機進程狀況工具
    虛擬機進程查看定位工具

  • jstat:虛擬機統計信息監視工具
    顯示類加載、內存、垃圾收集器、即時編譯等運行時數據,定位虛擬機性能問題
    參數參考:https://blog.csdn.net/ouyang111222/article/details/53688986

  • jinfo:Java配置信息工具

  • jmap:Java內存映像工具
    用于生成堆轉儲快照

  • jhat:虛擬機堆轉儲快照分析工具

  • jstack:Java堆棧跟蹤工具

  • jcmd:Java7開始提供的虛擬機診斷命令工具

基本Java工具

  • javadoc:API文檔生成器
  • javap:字節碼分析工具

6.2可視化故障處理工具

  • jhsdb:Java9開始提供的進程調試器,基于服務代理的調試工具
    首先使用jps查看進程號,然后jhsdb hsdb --pid xxx 進行操作
  • JConsole:Java監視與管理控制臺
    控制臺輸入jconsole,本地、遠程進行連接
  • VisualVM:多合-故障處理工具

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119751.html

相關文章

  • 學習JVM必看書籍

    學習JVM的相關資料 《深入理解Java虛擬機——JVM高級特性與最佳實踐(第2版)》 showImg(https://segmentfault.com/img/bVbsqF5?w=200&h=200); 基于最新JDK1.7,圍繞內存管理、執行子系統、程序編譯與優化、高效并發等核心主題對JVM進行全面而深入的分析,深刻揭示JVM的工作原理。以實踐為導向,通過大量與實際生產環境相結合的案例展示了解...

    shaonbean 評論0 收藏0
  • 深入理解Java虛擬》(四)虛擬性能監控故障處理工具

    摘要:虛擬機性能監控與故障處理工具詳解概述本文參考的是周志明的深入理解虛擬機第四章,為了整理思路,簡單記錄一下,方便后期查閱。虛擬機堆轉儲快照分析工具功能用于分析生成的。 虛擬機性能監控與故障處理工具 詳解 4.1 概述 本文參考的是周志明的 《深入理解Java虛擬機》 第四章 ,為了整理思路,簡單記錄一下,方便后期查閱。 JDK本身提供了很多方便的JVM性能調優監控工具,除了集成式的Vis...

    gself 評論0 收藏0
  • 深入理解Java虛擬》(一)Java虛擬發展史

    摘要:虛擬機發展史注本文大部分摘自深入理解虛擬機第二版作為一名開發人員,不能局限于語言規范,更需要對虛擬機規范有所了解。虛擬機規范有多種實現,其中是和中所帶的虛擬機,也是目前使用范圍最廣的虛擬機。世界第一款商用虛擬機。號稱世界上最快的虛擬機。 Java虛擬機發展史 注:本文大部分摘自《深入理解Java虛擬機(第二版)》 作為一名Java開發人員,不能局限于Java語言規范,更需要對Java虛...

    張春雷 評論0 收藏0
  • 深入理解Java虛擬》(三)垃圾集器內存分配策略

    摘要:當兩個對象相互引用時,這兩個對象就不會被回收引用計數算法不被主流虛擬機采用,主要原因是它很難解決對象之間相互循環引用的問題。 垃圾收集器與內存分配策略 詳解 3.1 概述 本文參考的是周志明的 《深入理解Java虛擬機》第三章 ,為了整理思路,簡單記錄一下,方便后期查閱。 3.2 對象已死嗎 在垃圾收集器進行回收前,第一件事就是確定這些對象哪些還存活,哪些已經死去。 3.2.1 引用...

    Edison 評論0 收藏0
  • 摘記《深入理解Java虛擬:JVM高級特性最佳實踐(第2)》

    摘要:第章內存區域與內存溢出異常運行時數據區域虛擬機在執行程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。即對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。 第2章 Java內存區域與內存溢出異常 2.2 運行時數據區域 Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。根據《Java虛擬機規范(Java SE 7版)...

    zoomdong 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<