JVM垃圾回收

如何判断对象可以回收

引用计数法

当对象被使用1次,计数器就加1,计数器为0的时候会触发垃圾回收机制。

可达性分析算法

从根对象开始,可以到达的对象,不是垃圾回收的对象,不可到达的对象就是垃圾回收的对象。

四种引用

强引用

平常最常见也是我们用的最多的一种引用方式:强引用,作为生命力最强的引用,只要引用还存在着,垃圾收集器(GC)就不会将该引用给回收,即使会出现内存溢出。就是说这种引用只要引用还一直指向的对象,GC是不会去管它的,所以叫它强引用。

软引用

当触发垃圾回收时,如果内存超限,就回收弱引用。

弱引用

当触发垃圾回收时,就回收弱引用。内存超不超限,都会被回收。

虚引用

虚引用是最弱的一种引用,它不会影响对象的生命周期,对象被回收跟它没啥关系。它引用的对象可以在任何时候被回收,而且也无法根据虚引用来取得一个对象的实例。仅仅当它指向的对象被回收的时候,它会受到一个通知。用的最少,类似没有引用,主要用于记录对象的销毁,和记录日志。

终结器引用

  • 它用于实现对象的finalize()方法,也可以称为终结器引用。
  • 无需手动编码,其内部配合引用队列使用。
  • 在GC时, 终结器引用入队。由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize()方法,第二次GC时才能回收被引用对象。

垃圾回收算法

标记清除

先标记后清除
优点:

缺点:

  • 造成空间不连续

标记整理

先标记,后清除,再整理
优点:

  • 没有内存碎片

缺点:

复制

先标记,后复制,再交换地址
优点:

  • 没有内存碎片

缺点:

  • 需要两倍的内存空间

分代垃圾回收

在这里插入图片描述

  • 对象都产生在伊甸园区
  • 当伊甸园空间不足时,触发minor gc。伊甸园和from存活的对象使用复制到to中,存活对象年龄加1,并且交换from to。
  • minor gc会引发stop the world ,暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行
  • 当对象寿命超过阈值时,会晋飞升至老年代,最大为15
  • 当老年代空间不足时,会先尝试minor gc,如果之后空间仍不足,那么触发full gc,STW的时间更长

垃圾回收器

串行

  • 单线程
  • 堆内存较小,适合个人电脑

吞吐量优先

  • 多线程
  • 堆内存较大,多核CPU支持
  • 让单位时间内,STW的时间最短

响应时间优先

  • 多线程
  • 堆内存较大,多核CPU支持
  • 尽可能让单次STW的时间最短

CMS收集器

对象:老年代
步骤:

  1. 初始标记
  2. 并发标记
  3. 并发预清理
  4. 重新标记
  5. 并发清理
  6. 收集器重置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值