美文网首页
内存分配和回收

内存分配和回收

作者: ycc_123456 | 来源:发表于2019-04-16 23:43 被阅读0次

    GC主要回收区域:JVM 堆

    1、堆的区域划分

    新生代、老年代  占用内存比例1:2

    新生代

    eden、from survivor、to survivor  占用内存比例8:1:1

    -Xmn 设置新生代大小

    -XX:survivorRatio=8 设置eden和survivor区的比例8:2。survivor分为from survivor和to survivor,并且比例是1:1,所以eden:from survivor:to survivor 的内存占比是 8:1:1

    2、GC判断对象的存活

    通过可达性分析算法分析对象是否存活。从GC roots的对象作为起点,从这些节点向下搜索,当一个对象到GC roots没有引用链连接时,说明该对象是不可用的,可以被回收。

    GC Root的对象包括:

    *静态属性引用的对象

    *常量引用的对象

    *虚拟机栈(栈帧中的本地变量表)中引用的对象

    *本地方法栈中引用的对象

    3、对象的引用

    强引用

    new 方式应用的对象,都是强引用

    软引用(SoftReference)

    内存空间足够时,GC不会回收软引用的对象;内存空间不足时,GC会回收软引用的对象。

    展示图片使用内存,可以使用软引用,内存不足时,GC会回收对象引用

    弱引用(WeakReference)

    无论内存空间是否充足,只要GC就会被回收

    ThreadLocal中使用弱引用

    虚引用(PhantomReference)

    4、垃圾回收算法

    复制回收算法:

    内存利用率低,只有50%

    在新生代使用复制回收算法

    默认情况下新生代的内存划分比例:一般内存中90%的对象不需要回收,10%的对象需要回收。由于新生代使用复制回收算法,内存利用率只有10%,所以新生代的20%作为复制算法的预留区域,即survivor区。eden:from survivor:to survivor=8:1:1

    标记-清除算法

    内存利用率100%,不需要内存复制,但是又有内存碎片

    标记-整理算法

    利用率100%,需要内存复制,不会有内存碎片

    5、JVM内存分配原则

    *对象优先放入eden区,eden区存放不下的大对象,直接进入老年区

    *长期存活的对象进入老年区,一次GC,对象的对象头中存放的对象年龄+1,年龄达到15时,进入老年去

    *动态对象年龄判断,一次GC后,需要存入from/to survivor区的对象超出分配的内存,from/to survivor区的对象全部进入老年区

    *空间担保策略(老年区)

    6、收集器

    有单线程收集器和并行多线程收集器

    G1

    CMS

    相关文章

      网友评论

          本文标题:内存分配和回收

          本文链接:https://www.haomeiwen.com/subject/jprwwqtx.html