Android中JVM内存回收机制

分代收集算法:

新生代(Young Generation)

回收时先将 Eden 区存活对象复制到一个 Survivor0 区,然后清空 Eden 区,当这个 Survivor0 区也存放满了时,则将 Eden 区和 Survivor0 区存活对象复制到另一个 Survivor1 区,然后清空 Eden 和这个 Survivor0 区,此时 Survivor0 区是空的,然后将 Survivor0 区和 Survivor1 区交换,即保持 Survivor1 区为空, 如此往复。当 Survivor1 区不足以存放 Eden 和 Survivor0 的存活对象时,就将存活对象直接存放到老年代。当对象在 Survivor 区躲过一次 GC 的话,其对象年龄便会加 1,默认情况下,如果对象年龄达到 15 岁,就会移动到老年代中。若是老年代也满了就会触发一次 Full GC,也就是新生代、老年代都进行回收。

老年代(Old Generation)

老年代(Old Generation):在新生代中经历了 N 次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。内存比新生代也大很多(大概比例是 1:2),当老年代内存满时触发 Major GC 即 Full GC,Full GC 发生频率比较低,老年代对象存活时间比较长,存活率高。一般来说,大对象会被直接分配到老年代。所谓的大对象是指需要大量连续存储空间的对象,最常见的一种大对象就是大数组。当然分配的规则并不是百分之百固定的,这要取决于当前使用的是哪种垃圾收集器组合和 JVM 的相关参数。

垃圾回收器:

在这里插入图片描述

  • 新生代可以适用的垃圾回收器:Serial(串行收集器)、ParNew(并行年轻代收集器)、Parallel Scavenge(并行回收器)
  • 老年代可以适用的垃圾回收器:CMS(并发标记-清除收集器)、Serial Old(串行老年代收集器)、ParallelOld(并行老年代收集器)
  • G1(Garbage First 收集器)和 ZGC(Z Garbage Collector)回收器适用于新生代和老年代混合回收
  • 相互之间有连线的表示可以配合使用,常用组合:Serial+Serial Old, Parallel Scavenge+Parallel
    Old,ParNew+CMS,G1(不需要组合其他收集器)

名词解释:

  • 并行回收(Parallel):多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态
  • 串行回收:单个垃圾收集线程工作
  • Minor GC(Young GC):发生在年轻代的GC
  • Full GC:发生在老年代的GC,full GC回收速度一般比Minor GC慢10倍左右,JVM调优也是主要针对Full GC进行调优

JVM常见三大回收算法:

Mark-Sweep(标记清除)

在这里插入图片描述

优点:

比较简单

缺点:

容易碎片化(内存空间不连续)

复制算法

在这里插入图片描述

优点:

效率非常高,速度非常快,因为操作系统对于管理内存来说,清除一块连续的内存效率很高,速度很快

缺点:

浪费空间

Mark-Compact(标记压缩)

在这里插入图片描述

优点:

不会产生碎片

缺点:

效率低

四种引用类型:

  1. 强引用(Strong Reference)

它是最常见的引用类型。当一个对象被一个强引用引用时,即使内存不足时,垃圾回收器也不会回收该对象。只有当该对象的所有强引用都被解除后,垃圾回收器才会回收该对象。强引用的应用场景通常是在对象的生命周期内都需要引用该对象的情况。

  1. 软引用(Soft Reference)

当一个对象如果只有软引用,只有当系统内存不足时,垃圾回收器才会回收该对象。软引用通常用来实现缓存或者高速缓存,当内存不足时可以释放一些缓存的对象。

  1. 弱引用(Weak Reference)

在面试过程中,很多面试者经常会将弱引用和软引用这两者搞混,其实从名字上可以看出,弱引用是比软引用更弱的一种引用类型,当垃圾回收器扫描到只具有弱引用的对象时,无论当前内存是否不足,都会对弱引用对象进行回收。

  1. 虚引用(Phantom Reference)

虚引用并不会对所指向的对象生命周期产生任何影响,也就是对象还是会按照它原来的方式被垃圾回收器回收,虚引用本质上只是一个标记作用,用来跟踪对象被垃圾回收的活动。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想迷路的小男孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值