面试题--java基础知识--垃圾回收GC

垃圾回收算法

标记算法

  • 对象被判定为垃圾的标准
    没有被其他对象引用
  • 引用计数算法(存在循环引用问题)
  • 可达性分析算法
    通过判断对象的引用链是否可达来决定对象是否可以被回收请添加图片描述

回收算法

标记清除算法

  • 标记:从根集合进行扫描,对存活的对象进行标记
  • 清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存
  • 缺点:碎片化严重

复制算法

  • 分为对象面和空闲面
  • 对象在对象面上创建
  • 存活的对象被从对象面复制到空闲面
  • 将对象面所有对象内存清除
  • 特点 :1、适用于对象存活率低的场景
    2、解决碎片化问题
    3、顺序分配内存,简单高效

标记整理算法

  • 标记:从根集合进行扫描,对存活的对象进行标记
  • 清除:移动所有存活的对象,且按照内存地址依次排列,然后将末端内存地址以后的内存全部回收
  • 特点:1、避免内存的不连续(碎片化)
    2、不用设置两块内存互换
    3、适用于存活率高的场景

分代收集算法(主流算法)

  • 垃圾回收算法的组合拳
  • 按照对象生命周期的不同划分区域以采用不同的垃圾回收算法
  • 目的:提高JVM的回收效率
  • GC分类 ①Minor GC使用复制算法 用于新生代回收
    ② Full GC 使用标记清除算法和标记整理算法 用于老年代回收

新生代 尽可能快速的收集掉生命周期短的对象

1 Eden区
2 两个Survivor区
(1)Eden区与两个Survivor区(from区、to区)按照8:1:1的比例进行分配
(2)第一次回收时会先将Eden区存活对象复制到from区(年龄加1)清除Eden区,第二次回收Eden区域和from区存活对象复制到to区(年龄加1)(如果to区存放不下比较大的对象,将被放到老年代),然后对Eden区与from区进行清除。from区和to区互换进行第三次回收,(每次复制年龄加1)超过15岁的将放入老年代.

  • 对象如何晋升到老年代
    1 经历一定Minor次数(15)依然存活的对象
    2 Survivor区中存放不下的对象
    3 新生成的大对象

老年代 存放生命周期较长的对象

新生代空间:老年代空间 = 1:2

  • 触发Full GC的条件
    1 老年代空间不足
    2 1.8之前 永久代空间不足
    3 CMS GC时出现promotion failed , concurrent mode failure
    4 Minor GC 晋升到老年代的平均大小大于老年代的剩余空间
    5 调用system.gc()
    6 使用RMIj来进行RPC或管理的JDK应用,每小时进行一次Full GC

垃圾收集器

请添加图片描述

Java中的四种引用

强引用(Strong Reference)

  • 最普通的引用: new Object(0;
  • 抛出OutOFMemoryError终止程序也不会回收具有强引用的对象
  • 通过将对象设置为null来弱化引用,使其被回收

软引用(Soft Reference)

  • 对象处在有用但非必须的状态
  • 只有当内存空间不足时,GC会回收该引用对象的内存
  • 可以用来实现高速缓存

弱引用(Weak Reference)

  • 非必需的对象,比软引用更弱一些
  • GC时会被回收
  • 被回收的概率也不大,因为GC线程优先级比较低
  • 适用于引用偶尔被使用且不影响垃圾收集的对象

虚引用

  • 不决定对象的生命周期
  • 任何时候都可能被垃圾收集器回收
  • 跟踪对象被垃圾收集器回收的活动,起哨兵作用
  • 必须和引用队列ReferenceQueue联合使用请添加图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值