<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    Java內(nèi)存回收和常用算法

    共 1812字,需瀏覽 4分鐘

     ·

    2021-05-14 20:17

    1.什么是垃圾?(Java中)

    (1)一個對象沒有任何引用指向這個對象

    (2)幾個對象之間互相循環(huán)引用,但是沒有引用指向這個循環(huán),那這個幾個對象屬于一堆垃圾

    總結(jié)一句話:沒有任何引用指向的一個對象或者多個對象


    2.如何定位垃圾?

    (1)reference count(引用計數(shù)):

    對于對象進(jìn)行一個引用的標(biāo)記,有兩個引用它的就標(biāo)記為2,沒有引用它的就標(biāo)記為0,但是這種對于循環(huán)的引用的垃圾是無法回收的,這樣就會發(fā)生內(nèi)存泄漏

    (2)Root Searching(根可達(dá)算法):

    根據(jù)根對象一步一步去找引用的對象,最終沒有找到的都被認(rèn)為是垃圾


    根對象包括:線程棧變量,靜態(tài)變量,常量池,JNI指針

    以下是java中的原話:



    3.常見的垃圾回收算法

    Mark-Sweep(標(biāo)記清除)

    Coping(拷貝)

    Mark-Compact(標(biāo)記壓縮)


    (1)Mark-Sweep——缺點(diǎn):位置不連續(xù),產(chǎn)生碎片


    (2)Coping——缺點(diǎn):沒有碎片,但是浪費(fèi)空間


    (3)Mark-Compact——沒有碎片,也不浪費(fèi)空間,但是效率較低,比copy略低

    有用的部分都壓縮到最前面,空著的部分放在最后面,不碎片化,也不浪費(fèi)空間



    4.JVM內(nèi)存分代模型(用于分代垃圾回收算法)

    1.部分垃圾回收器使用的模型

    2.新生代+老年代+永久代(1.7)/元數(shù)據(jù)區(qū)(1.8)Metaspace

    (1)永久代和元數(shù)據(jù)區(qū)都是用來裝class對象的

    (2)永久代必須指定大小限制,元數(shù)據(jù)是可以設(shè)置,也可以不設(shè)置,無上限(受限于物理內(nèi)存)

    (3)jdk1.7版本的字符串常量是存在永久代的,1.8版本的時候是存在堆里

    (4)MethodArea(方法區(qū))是一種邏輯概念,在jdk1.7版本上對應(yīng)的是永久代,在jdk1.8上對應(yīng)的是元數(shù)據(jù)區(qū)

    new-young:存活對象少,使用copy算法,效率高

    old:垃圾少,一般使用mark-compact,g1使用copy

    在java1.7中還有permanent算法

    3.堆內(nèi)存邏輯分區(qū)


    new一個對象,直接去找伊甸區(qū),如果new的對象太大,伊甸區(qū)裝不下,直接進(jìn)入老年代

    YGC使用拷貝算法,FGC使用標(biāo)記壓縮算法,YGC雖然無法避免但是效率較高,FGC效率較低

    (1)新生代=Eden + 2個suvivor區(qū)

    1. YGC回收之后,大多數(shù)的對象(90%)會被回收,活著的進(jìn)入s0再次YGC,活著的對象eden + s0 -> s1再次YGC,eden + s1 -> s0年齡足夠 -> 老年代 (老版的垃圾回收器:15歲,15歲即回收15次,為什么是15次呢,因為在一個對象的頭部有4位來代表它的年齡,這個4位代表的最大數(shù)就是15, CMS垃圾回收器:6歲)s區(qū)裝不下 -> 老年代

    (2)老年代

    1. 頑固分子老年代滿了FGC Full GC

    (3)GC Tuning (GC調(diào)優(yōu),假設(shè)使用的是Generation算法)

    1. 盡量減少FGCMinorGC = YGCMajorGC = FGC


    5.Java到目前為止產(chǎn)生的10種垃圾回收器


    垃圾回收器組合:

    最早的jdk垃圾回收器的組合: Serial + Serial Old

    常見的垃圾回收器組合Parallel Scavenge + Parallel Old


    (1)Serial垃圾回收器


    (2)Parallel Scavenge 年輕代 并行回收


    (3)ParNew 年輕代 配合CMS的并行回收


    (4)SerialOld


    (5)ParallelOld


    (6)Concurrent Mark Sweep(CMS) 老年代,并發(fā)的, 垃圾回收和應(yīng)用程序同時運(yùn)行,降低STW的時間(200ms)


    (7)G1(10ms)



    (8)ZGC (1ms) PK C++

    (9)Shenandoah

    (10)Eplison

    這是一個空的GC,本身并沒有做任何事情,只是用來調(diào)試jdk的,jdk11才有

    jdk1.8 默認(rèn)的垃圾回收:Parallel Scavenge + Parallel Old


    6.GC概念




    7.總結(jié),內(nèi)存分配流程圖




    8.JVM調(diào)優(yōu)工具

    arthas

    Java VisualVM

    jmap命令



    9.GC調(diào)優(yōu)日志詳解

    ?

    瀏覽 54
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    国产精品操逼视频 | 波多野结衣一二三区乱码 | 成人大香蕉在线 | 日本免费内射 | 91免费成人 |