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

資訊專欄INFORMATION COLUMN

《深入理解Java虛擬機(jī)第3版》垃圾收集器與內(nèi)存分配策略、虛擬機(jī)性能監(jiān)控故障處理工具

Kerr1Gan / 2989人閱讀

摘要:目錄往期博客課堂篇初識(shí)常量池簡(jiǎn)單理解字符串常量池靜態(tài)常量池大整型常量池為什么要了解垃圾收集和內(nèi)存分配如何判斷對(duì)象已死引用計(jì)數(shù)算法可達(dá)性分析算法之后引用的擴(kuò)充回收方法區(qū)垃圾收集算法分代收集理論標(biāo)記清除標(biāo)記復(fù)制標(biāo)記整理對(duì)象分

目錄


  1. 為什么要了解垃圾收集和內(nèi)存分配?
  2. 如何判斷對(duì)象已死?
    • 引用計(jì)數(shù)算法
    • 可達(dá)性分析算法
    • JDK1.2之后引用的擴(kuò)充
  3. 回收方法區(qū)
  4. 垃圾收集算法分代收集理論
    • 標(biāo)記清除
    • 標(biāo)記復(fù)制
    • 標(biāo)記整理
  5. 對(duì)象分配
  6. 虛擬機(jī)性能監(jiān)控故障處理工具

1、為什么需要了解垃圾收集和內(nèi)存分配?

當(dāng)需要排查各種內(nèi)存溢出、內(nèi)存泄露問(wèn)題時(shí),當(dāng)垃圾收集成為系統(tǒng)達(dá)到高并發(fā)量的瓶頸時(shí),我們必須對(duì)這些“自動(dòng)化”的技術(shù)實(shí)

施必要的監(jiān)控和調(diào)節(jié)。

2、如何判斷對(duì)象已死?

2.1、引用計(jì)數(shù)法

  • 在對(duì)象中添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器值就加1,當(dāng)有一個(gè)地方取消引用它時(shí),計(jì)數(shù)器值減1
  • 雖然額外占用內(nèi)存空間,但是他的原理簡(jiǎn)單,判定效率也很高
  • Java領(lǐng)域主流的虛擬機(jī)未采用沒(méi)有選擇用,因?yàn)檫@個(gè)看似簡(jiǎn)單的算法有很多例外的情況要考慮,必須配合額外的大量處理才能確保正確工作,如單純的引用計(jì)數(shù)很難解決對(duì)象之間的互相引用問(wèn)題。

2.2、可達(dá)性分析

  • 通過(guò)一系列的GC Roots的根對(duì)象作為起始點(diǎn)集,從這些結(jié)點(diǎn)開始,根據(jù)引用關(guān)系向下搜索,搜索走過(guò)的路徑稱為引用鏈,如果某個(gè)對(duì)象到GC Roots間沒(méi)有任何引用鏈相連,或者用圖論的話來(lái)說(shuō)就是不可達(dá),證明這個(gè)對(duì)象不再被使用
  • 固定可以作為GC Roots的對(duì)象包括:
    • 虛擬機(jī)棧引用的對(duì)象(方法參數(shù)、局部變量、臨時(shí)變量)
    • 方法區(qū)的靜態(tài)屬性引用的對(duì)象
    • 方法區(qū)的常量池引用的對(duì)象
    • 本地方法棧Native方法引用的對(duì)象
    • 虛擬機(jī)內(nèi)部的引用
    • 同步鎖synchrionized持有的對(duì)象

2.3、JDK1.2之后引用的擴(kuò)充

四種新擴(kuò)充的引用

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

3、回收方法區(qū)

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

4、垃圾收集算法

垃圾收集算法可以劃分為

  • 引用計(jì)數(shù)式垃圾收集(對(duì)應(yīng)前面的 引用計(jì)數(shù)算法)
  • 追蹤式垃圾收集(對(duì)用前面的 可達(dá)性分析算法)

分代收集設(shè)計(jì)原則

  • 弱分代假說(shuō):任何對(duì)象都是朝生夕滅
  • 強(qiáng)分代假說(shuō):熬過(guò)越多次垃圾收集的對(duì)象就越難消亡

因此存在

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

4.1、標(biāo)記清除算法

算法分為 標(biāo)記 和 清除 兩個(gè)階段

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

缺點(diǎn)

  • 執(zhí)行效率不太穩(wěn)定:如果Java堆中包含大量對(duì)象,而且其中大部分都是需要回收的,這時(shí)需要大量標(biāo)記和清除操作
  • 內(nèi)存空間碎片化問(wèn)題:清除之后,產(chǎn)生大量不連續(xù)的內(nèi)存空間,當(dāng)需要分配大對(duì)象是,有可能放不下還需要進(jìn)行一次GC

4.2、標(biāo)記復(fù)制算法

相比標(biāo)記清除算法

  • 半?yún)^(qū)復(fù)制:將內(nèi)存容量劃分為大小相等的兩塊,每次只使用其中的一塊,當(dāng)這一塊內(nèi)存用完了,就還將存活的對(duì)象復(fù)制到另外一塊,再把使用過(guò)的一塊內(nèi)存全部回收清理。
  • 缺點(diǎn):這種算法產(chǎn)生大量的內(nèi)存空間復(fù)制的開銷,可用內(nèi)存縮小為原來(lái)的一半,空間浪費(fèi)。

半?yún)^(qū)復(fù)制分代策略

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

4.3、標(biāo)記整理算法

相比于新生代使用標(biāo)記復(fù)制算法、標(biāo)記清除算法

  • 老年代不能使用標(biāo)記復(fù)制算法,因?yàn)槔夏甏鷮?duì)象存活率高,進(jìn)行復(fù)制會(huì)浪費(fèi)內(nèi)存空間
  • 針對(duì)老年代對(duì)象的死亡特征,需要使用標(biāo)記-整理算法,區(qū)別于標(biāo)記-清除算法本質(zhì)區(qū)別就是 不是直接對(duì)可回收對(duì)象清理,而是將存活的對(duì)象往一段移動(dòng),清除邊界以外的內(nèi)存。

特點(diǎn)

  • 移動(dòng)存活對(duì)象的·時(shí)候,尤其是老年代,移動(dòng)對(duì)象地址需要全部用戶程序才能進(jìn)行Stop The World
  • 不移動(dòng)時(shí)候采用標(biāo)記清除算法,內(nèi)存分配復(fù)雜
  • 移動(dòng)的時(shí)候采用標(biāo)記整理算法,回收時(shí)更復(fù)雜
  • 有一種和稀泥方式,碎片化程度到達(dá)一定程度開啟移動(dòng)

5、對(duì)象分配

對(duì)象的內(nèi)存分配從概念上講都是堆上分配,(實(shí)際可能有即時(shí)編譯后被拆散為標(biāo)量類型并間接的在棧上分配),在經(jīng)典分代的設(shè)計(jì)下,新生對(duì)象會(huì)直接分布在新生代,一些超過(guò)閾值的大對(duì)象可以直接分布在老年代

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

6、虛擬機(jī)性能監(jiān)控故障處理工具

6.1基礎(chǔ)故障處理工具

  • jsp:虛擬機(jī)進(jìn)程狀況工具
    虛擬機(jī)進(jìn)程查看定位工具

  • jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具
    顯示類加載、內(nèi)存、垃圾收集器、即時(shí)編譯等運(yùn)行時(shí)數(shù)據(jù),定位虛擬機(jī)性能問(wèn)題
    參數(shù)參考:https://blog.csdn.net/ouyang111222/article/details/53688986

  • jinfo:Java配置信息工具

  • jmap:Java內(nèi)存映像工具
    用于生成堆轉(zhuǎn)儲(chǔ)快照

  • jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具

  • jstack:Java堆棧跟蹤工具

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

基本Java工具

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

6.2可視化故障處理工具

  • jhsdb:Java9開始提供的進(jìn)程調(diào)試器,基于服務(wù)代理的調(diào)試工具
    首先使用jps查看進(jìn)程號(hào),然后jhsdb hsdb --pid xxx 進(jìn)行操作
  • JConsole:Java監(jiān)視與管理控制臺(tái)
    控制臺(tái)輸入jconsole,本地、遠(yuǎn)程進(jìn)行連接
  • VisualVM:多合-故障處理工具

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/119751.html

相關(guān)文章

  • 學(xué)習(xí)JVM必看書籍

    學(xué)習(xí)JVM的相關(guān)資料 《深入理解Java虛擬機(jī)——JVM高級(jí)特性與最佳實(shí)踐(第2版)》 showImg(https://segmentfault.com/img/bVbsqF5?w=200&h=200); 基于最新JDK1.7,圍繞內(nèi)存管理、執(zhí)行子系統(tǒng)、程序編譯與優(yōu)化、高效并發(fā)等核心主題對(duì)JVM進(jìn)行全面而深入的分析,深刻揭示JVM的工作原理。以實(shí)踐為導(dǎo)向,通過(guò)大量與實(shí)際生產(chǎn)環(huán)境相結(jié)合的案例展示了解...

    shaonbean 評(píng)論0 收藏0
  • 深入理解Java虛擬機(jī)》(四)虛擬機(jī)性能監(jiān)控故障處理工具

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

    gself 評(píng)論0 收藏0
  • 深入理解Java虛擬機(jī)》(一)Java虛擬機(jī)發(fā)展史

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

    張春雷 評(píng)論0 收藏0
  • 深入理解Java虛擬機(jī)》(三)垃圾集器內(nèi)存分配策略

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

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

    摘要:第章內(nèi)存區(qū)域與內(nèi)存溢出異常運(yùn)行時(shí)數(shù)據(jù)區(qū)域虛擬機(jī)在執(zhí)行程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。即對(duì)象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例。 第2章 Java內(nèi)存區(qū)域與內(nèi)存溢出異常 2.2 運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)在執(zhí)行Java程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。根據(jù)《Java虛擬機(jī)規(guī)范(Java SE 7版)...

    zoomdong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<