深入研究javagc-創(chuàng)新互聯(lián)

2019/4/2 星期二
深入研究java gc
引出問題和小結(jié)!
應(yīng)該是全網(wǎng)最全的JVM知識點總結(jié) https://www.toutiao.com/i6717184983829578254/
//此鏈接很重要 推薦收藏
你解釋一下什么是JVM?什么是JDK?什么是JRE?我懵了
https://www.toutiao.com/i6714156440199627276/
小結(jié):
1、為什么使用CMS gc回收算法?
//答:
因為在CMS gc算法執(zhí)行的6個步驟中,只有在第一步(初始標記(STW Initial Mark))和第四步重新標記階段(STW REMARK)才會暫停整個應(yīng)用,這樣對應(yīng)用程序所帶來的影響非常小,缺點是產(chǎn)生內(nèi)存碎片過多
2、那CMS GC策略如何導(dǎo)致內(nèi)存碎片過多?
//答:是因為第二步并發(fā)標記(concurrent marking)與回收線程會與應(yīng)用程序爭搶CPU資源,容易產(chǎn)生內(nèi)存碎片,其二:CMS算法在標記清理之后并沒有重新壓縮分配存活對象,因此整個老生代會產(chǎn)生很多的內(nèi)存碎片。
3、那為什么CMS gc策略會耗時比較長呢?
//答:
‘stop-the-world’暫停時間也很短暫,耗時較長的(第二步并發(fā)標記)標記和(第三步并發(fā)預(yù)清理)清理都是并發(fā)執(zhí)行的。

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁設(shè)計師等,應(yīng)用各種網(wǎng)絡(luò)程序開發(fā)技術(shù)和網(wǎng)頁設(shè)計技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)專業(yè)提供做網(wǎng)站、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站制作(企業(yè)站、響應(yīng)式網(wǎng)站開發(fā)、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗的提升,我們力求做到極致!

內(nèi)存碎片過多如何觸發(fā)Full GC?
//答:
CMS并不是很完美,它會在兩種場景下產(chǎn)生嚴重的Full GC(Concurrent Failure(并發(fā)失敗),Promotion Failure (促銷失?。?br/>具體見:老年代 CMS gc回收算法 對hbase的影響 https://blog.51cto.com/12445535/2373206

HBase在演進的道路上又如何不斷優(yōu)化CMS GC?

具體內(nèi)容見下詳細介紹:


題外話:什么是java程序的執(zhí)行流程;java運行時數(shù)據(jù)區(qū);java的內(nèi)存管理 見如下圖:
java程序執(zhí)行流程:
深入研究java gc

java運行時數(shù)據(jù)區(qū):
深入研究java gc

java的內(nèi)存管理:
深入研究java gc

在我們(運行時數(shù)據(jù)區(qū))之中,內(nèi)存的分配一共有五塊:
1、堆內(nèi)存(Heap):保存真正的程序的數(shù)據(jù)的部分;
2、&&&棧內(nèi)存(Stack):保存堆內(nèi)存地址、還保存基本數(shù)據(jù)、方法的執(zhí)行;(所有的數(shù)據(jù)都在棧內(nèi)存之中)
3、方法區(qū):保存所有方法的具體的操作,該區(qū)域?qū)儆诠蚕恚?br/>4、程序計數(shù)器:這是一塊很小的內(nèi)存,小到幾乎可以忽略的地步,只是做一個程序執(zhí)行順序的記錄,只是為了標記我們下一步要執(zhí)行的代碼的順序號;
5、本地方法棧:該棧之中所保存的都是操作系統(tǒng)的原生函數(shù)。
我們關(guān)心的主要是堆內(nèi)存、棧內(nèi)存、方法區(qū)

在整個的JVM內(nèi)存組成過程之中,(棧內(nèi)存)是一個非常重要的概念,因為在該內(nèi)存之中,他需要保存的數(shù)據(jù)是一組內(nèi)容,

因為所有的方法在進行遞歸調(diào)用的時候都會采用棧的模式。觀察遞歸問題中滿棧的原因取決于服務(wù)器內(nèi)存的大小。

內(nèi)存操作有關(guān)的兩類異常
stackOverFlowError(棧溢出):如果請求的棧的深度過大,虛擬機可能會拋處。
OutOfMemoryError(內(nèi)存溢出):如果虛擬機的實現(xiàn)中允許、虛擬機棧動態(tài)擴展,當(dāng)內(nèi)存不足以擴展棧的時候,會拋出?!緝?nèi)存被沾滿,更多情況下表示堆也分配不了了】

實際上上面只是觀察到了兩類可能出現(xiàn)錯誤的代碼,但是并不是意味著棧中只能夠保存一下基本的信息,實際上棧里面保存同樣是一組的數(shù)據(jù)。

總結(jié):
1、造成stackOverFlowError(棧溢出)OutOfMemoryError(內(nèi)存溢出)的原因是;
2、在JVM棧內(nèi)存中保存有棧幁的概念,所有的棧內(nèi)存采用先進后出的數(shù)據(jù)結(jié)構(gòu)來進行我們的存儲。

首先需要了解一下什么是java的堆內(nèi)內(nèi)存劃分
在實際情況下:java 堆內(nèi)存劃分分為了(jdk1.8以前和jdk1.8之后)【對于這2者的區(qū)別,我們后面介紹】
jvm堆內(nèi)存劃分(jdk1.8以前):
深入研究java gc

jvm堆內(nèi)存劃分(jdk1.8之后):
深入研究java gc

java堆內(nèi)存模型
java的垃圾收集主要指的是java堆內(nèi)存空間,那么在每一次執(zhí)行GC的時候需要區(qū)分出那些堆內(nèi)存空間需要被回收,那些不應(yīng)該被回收。 所以為了整個的回收處理方便,JVM將堆內(nèi)存分為如下的幾個組成部分。而這幾個組成部分你還需要去考慮JDK的版本,現(xiàn)在的JVM內(nèi)存劃分就必須考慮JDK1.8以前和JDK1.8之后的問題了。
如果簡化點來理解的話:
1、新生代:那些剛剛創(chuàng)建的對象,剛剛創(chuàng)建的對象有可能會存在有許多垃圾對象,那么這些對象應(yīng)該是被優(yōu)先回收的;
2、老年代:老不死的那類對象,經(jīng)過了很多次的清理之后你發(fā)現(xiàn)該對象依然有用,
3、永久代:intern()方法進行入池的對象實際上就在永久代中,永久代不會被回收。因為其本身屬于一個bug性的存在(也就是jdk崩潰了,死了永久代CIA能消失),所以在jdk1.8之后,將其更換為元空間(就是電腦的直接內(nèi)存)。
舉個例子:我電腦有100G內(nèi)存,80G給了堆內(nèi)存,那剩下的20G就可以給元空間。

在整個內(nèi)存的組成過程之中,每一代的內(nèi)存空間都會有一個伸縮區(qū),那么該區(qū)域就可以由JVM根據(jù)空間的使用情況,動態(tài)擴充。
當(dāng)我們適當(dāng)合理的設(shè)置了伸縮區(qū)的內(nèi)存大小之后,那么就可以得到良好的性能提升。也就是說最容易的性能提升就是改變伸縮區(qū)的內(nèi)存大小。

首先什么是java gc 、java對象創(chuàng)建流程
java對象創(chuàng)建流程如圖:
深入研究java gc

1、大多數(shù)內(nèi)存對象要么生存周期比較短,很快就會沒人引用,比如處理RPC請求的buffer可能只會生存幾微秒;
2、要么生存周期比較長,比如Block Cache中的熱點Block,可能就會生存幾分鐘,甚至更長時間。
3、基于這樣的事實,JVM將整個堆內(nèi)存分為兩個部分:新生代(young generation)和老生代(tenured generation),除此之外,JVM還有一個非堆內(nèi)存區(qū)-Perm區(qū),主要存放class信息以及其他meta元信息,
4、其中Young區(qū)又分為Eden區(qū)和兩個Survivor 區(qū):S0和S1。
5、一個內(nèi)存對象在創(chuàng)建之后,首先會為其在新生代申請一塊內(nèi)存空間,如果這個對象在新生代存活了很長時間,會將其遷移到老生代。
6、在大多數(shù)對延遲敏感的業(yè)務(wù)場景下(比如HBase),建議使用如下JVM參數(shù),-XX:+UseParNewGC和XX:+UseConcMarkSweepGC,其中前者表示對新生代執(zhí)行并行的垃圾回收機制,而后者表示對老生代執(zhí)行并行標記-清除垃圾回收機制。
7、可見,JVM允許針對不同內(nèi)存區(qū)執(zhí)行不同的GC策略。
//在 cdh中默認是這樣設(shè)置的
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled


接下來重點先討論一下年輕代

深入研究java gc

年輕代GC實現(xiàn)復(fù)制算法:(年輕代GC策略 – Parallel New Collector)
深入研究java gc

1、對象初始化之后會被放入Young區(qū),更具體的話應(yīng)該是Eden區(qū),當(dāng)Eden區(qū)滿了之后,會進行一次GC。
2、GC算法會檢查所有對象的引用情況,如果某個對象還有被引用,表示該對象存活。
3、檢查完成之后,會將這些存活的對象移到S0區(qū),并且回收整個Eden區(qū)空間,稱為一次Minor GC;
4、接著新對象進來,又會放入Eden區(qū),滿了之后會檢查S0和Eden區(qū)存活的對象,將所有存活的對象移到S1區(qū),再回收整個S0和Eden區(qū)空間;
5、很容易理解,S0和S1兩個區(qū)總會有一個區(qū)是預(yù)留給下次存放存活對象用的。

這種算法稱為復(fù)制算法,對于這種算法,有兩點需要關(guān)注:

  1. 算法會執(zhí)行’stop-the-world’暫停,但時間非常短。因為Young區(qū)通常會設(shè)置的比較?。ㄒ话悴唤ㄗh不超過512M),而且JVM會啟動大量線程并發(fā)執(zhí)行,一次Minor GC一般都會在幾毫秒內(nèi)完成
  2. 不會產(chǎn)生碎片,每次GC之后都會將存活的對象放入連續(xù)的空間(S0或S1)
    內(nèi)存中所有對象都會維護一個計數(shù)器,每次Minor GC移動一個對象之后,都會為這個對象的計數(shù)器加一。當(dāng)計數(shù)器增加到一定閾值之后,算法就會認為該對象生命周期很長,會將其移入老生代。該閾值可以通過JVM參數(shù)XX:MaxTenuringThreshold指定。

提高了解篇
年輕代優(yōu)化算法

深入研究java gc

深入研究java gc

深入研究java gc

年輕代內(nèi)存調(diào)整參數(shù)(重要):
深入研究java gc


接下來深度研究老年代

什么是老年代 和老年代的full gc:
深入研究java gc

老生代GC策略 – Concurrent Mark-Sweep(CMS算法)
什么是CMS 為什么CMS?
1、每次執(zhí)行Minor GC之后,都會有部分生命周期較長的對象被移入老生代,一段時間之后,老生代空間也會被占滿。
2、此時就需要針對老生代空間執(zhí)行GC操作,此處我們介紹Concurrent Mark-Sweep(CMS)算法。

CMS算法整個流程分為6個階段,其中部分階段會執(zhí)行 ‘stop-the-world’ 暫停,部分階段會和應(yīng)用線程一起并發(fā)執(zhí)行:
如圖:
深入研究java gc

老年代執(zhí)行CMS過程:
深入研究java gc
相應(yīng)的,對于CMS算法,也需要關(guān)注兩點:

  1. ‘stop-the-world’暫停時間也很短暫,耗時較長的標記和清理都是并發(fā)執(zhí)行的。
  2. CMS算法在標記清理之后并沒有重新壓縮分配存活對象,因此整個老生代會產(chǎn)生很多的內(nèi)存碎片。

提高篇
老年代標記清除算法:
深入研究java gc

老年代標記壓縮算法:
深入研究java gc

老年代內(nèi)存調(diào)整參數(shù):
深入研究java gc

永久代調(diào)整參數(shù):
深入研究java gc

元空間調(diào)整參數(shù):
深入研究java gc


可用gc方式小結(jié):
深入研究java gc

年輕代串行GC(copy)
深入研究java gc

年輕代并行回收GC
深入研究java gc

年輕代并行GC
深入研究java gc

老年代串行GC
深入研究java gc

老年代并行GC
深入研究java gc

常用gc策略:
深入研究java gc

GC調(diào)整策略、
深入研究java gc

收集器參數(shù)設(shè)置
深入研究java gc


G1收集器介紹:
深入研究java gc

深入研究java gc

深入研究java gc

深入研究java gc

深入研究java gc

深入研究java gc

參考鏈接:
http://hbasefly.com/2016/05/21/hbase-gc-1/

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

文章題目:深入研究javagc-創(chuàng)新互聯(lián)
鏈接地址:http://bm7419.com/article14/iigde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、網(wǎng)站制作App開發(fā)、網(wǎng)站改版、自適應(yīng)網(wǎng)站、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站