android gc root,Android 面试经验 - Java GC(垃圾回收机制)

Java GC(垃圾回收机制)

本文根据 怎么在面试时回答Java垃圾回收机制相关问题? 提供的回答思路对 Java性能优化之JVM GC 一文作了一番整理。

目录

Java GC(垃圾回收机制)目录

分代回收机制新生代空间分配

执行顺序

老年代

持久代

GC 执行时机

回收算法根搜索算法–基础算法

复制算法

标记-整理算法

分代回收机制

新生代

绝大多数刚被创建的对象

在创建后很快变得不可达,被 JVM 回收

对象从这个区域被回收的过程称为 Minor GC

回收算法:复制算法

空间分配

一个伊甸园空间(Eden)

两个幸存者空间(From Survivor、To Survivor)

默认新生代空间的分配:Eden : From : To = 8 : 1 : 1

执行顺序

大多数刚被创建的对象会存放在伊甸园空间

伊甸园执行第一次 Minor GC 之后,存活的对象会移动到其中一个幸存者空间

此后每次伊甸园每次 GC 都会将存活的对象堆积到同一个幸存者空间

当一个幸存者空间满了之后,还存活的对象会移动到另一个幸存者空间,然后清空饱和的那个幸存者空间

在以上步骤中重复N次(N = MaxTenuringThreshold(年龄阀值设定,默认15))依然存活的对象,就会被移动到老年代

从上面的步骤可以发现,两个幸存者空间,必须有一个是保持空的。

对象在刚刚被创建之后,是保存在伊甸园空间的(Eden)。那些长期存活的对象会经由幸存者空间(Survivor)转存到老年代空间(Old generation)。

也有例外出现,对于一些比较大的对象(需要分配一块比较大的连续内存空间)则直接进入到老年代。一般在Survivor 空间不足的情况下发生。

老年代

对象没有变得不可达,并且从新生代周期中存活了下来,会被拷贝到这里

该区域分配的空间要比新生代多。

GC次数要比新生代少得多。

对象从老年代中被回收的过程,称为 Full GC 或者 Major GC

Major GC 的时间比 Minor GC 要更长

回收算法:标记-整理算法

持久代

也称为方法区(即Java内存模型中的方法区)

保存类常量以及字符串常量

发生在这个区域的GC事件也被算为Major GC

发生GC的条件非常严苛,必须符合以下三种条件:

1.所有实例被回收

2.加载该类的ClassLoader被回收

3.Class对象无法通过任何途径访问(包括反射)

GC 执行时机

新生代的伊甸园空间(Eden)不够存放新对象的时候,执行 Minro GC 。

升到老年代的对象大于老年代剩余空间的时候(或者小于的时候被 HandlePromotionFailure 参数强制)执行 Full GC 。

回收算法

根搜索算法–基础算法

从 GC ROOT 节点开始,寻找对应的引用节点,找到这个节点后,继续寻找这个节点的引用节点。当所有的引用节点寻找完毕后,构成一张图。没有在图中的节点被认为是没有被引用到的节点,即无用的节点。

038cd5bdece73d571743d6f072e5a730.png

目前 Java 中可以作为 GC ROOT 的对象有:

1. 栈中引用的对象(本地变量表)

2. 本地方法栈中引用的对象(Native对象)

3. 方法区中静态属性引用的对象

4. 方法区中常量引用的对象

复制算法

复制算法将内存划分为两个区间,一个活动区间,一个空闲区间,其中活动区间存放的是动态分配的对象。

复制算法从根集合扫描活动区间,将存活的对象复制到空闲区间。扫描完毕后,将活动区间清空。把原本的空闲区间变成活动区间。以此循环。

复制算法在存活对象比较少的时候,极为高效,利用空间换来时间。所以复制算法的使用场景,必须是对象的存活率非常低才行,而且最重要的是,我们需要克服50%内存的浪费。

b44ce12c06a6fa8903dd356f0da910c6.png

标记-整理算法

标记-整理算法从根集合进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象进行直接回收。回收不存活的对象之后,会将所有存活的对象往左端空闲空间移动。避免产生内存碎片。

20124baee9d479309e3e05fa15c5b050.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值