【JVM】垃圾回收机制

1.如何判断对象是否死亡?

  1. 引用计数法
    对象中加一个引用计数器,有地方引用它,计数器加1;引用失效,计数器减1;计数器为0的对象就是不能在被使用了。虽然实现简单,效率高,但是难解决对象之间相互循环引用的问题,所以不被JVM采用
  2. 可达性分析算法
    通过一个叫做GC Roots的对象作为起点,从这个节点向下搜索,节点走过的路径成为引用链,当一个对象到GC Roots没有引用链的话,那么说明该对象要被回收了。

    例如Object6~Object10之间虽有引用关系,但是不能到达GC Roots,所以,它们就是需要被回收的对象。对象可以被回收,但是不一定就代表一定会回收。

2.介绍强引用,软引用,弱引用,虚引用

上述四种引用,引用强度逐渐减弱

  1. 强引用
    就像是我们的生活必需品,垃圾回收器绝不会回收它。就算JVM抛错,也不会随意回收强引用对象
  2. 软引用
    可有可无的生活用品。内存空间足够,垃圾回收器不会回收它;如果不足了,就回收。
  3. 弱引用
    类似可有可无生活用品。
  4. 虚引用
    形同虚设。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。

总结:使用软引用较多,因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统运行安全,防止内存溢出等问题产生

3.如何判断一个常量是废弃常量?

如果没有任何对象引用的话,那么就是废弃常量

4.如何判断一个类是无用的类?

满足下面三个条件才判定是无用的类:

  1. Java 堆中不存在该类的任何实例。(该类所有的实例都已经被回收)
  2. 加载该类的 ClassLoader 已经被回收
  3. 无法在任何地方通过反射访问该类的方法

5.垃圾收集有哪些算法,各自特点?

  1. 标记-清除算法

    分为标记,清除阶段。先标记不需要回收的对象,标记完成后,统一回收掉所有没被标记的对象。

    存在问题:1. 效率问题;2. 空间问题(会产生大量不连续的碎片)

  2. 标记-复制算法

    意义:为了解决效率问题

    思想:将内存分为大小相同的两块,每次只使用其中一块。这一块使用完后,标记存活的对象复制到另一块去,然后把使用的空间全部清理。

    图解:

    但依然存在下面这些问题:

    ○ 可用内存变小:可用内存缩小为原来的一半。

    ○ 不适合老年代:如果存活对象数量比较大,复制性能会变得很差

  3. 标记-整理算法

    思想:先标记不需要回收的对象,然后将这些存活对象向一端移动,最后直接清理掉边界以外的内存

    图解:

  4. 分代收集算法(当前虚拟机采用的算法)

    思想:根据对象存活周期将内存分为几块。一般将Java堆分为新生代和老年代,然后根据各个代的情况选择合适的回收算法

    举例:新生代会有大量对象死去,可以选择标记-复制算法。老年代对象存活几率高,没有额外的空间对它进行分配担保,所以必须选择标记-清除或者标记-整理算法

6.垃圾收集器

如果说垃圾收集算法是方法论的话,那么垃圾收集器就是内存回收的具体实现

参考链接

https://javaguide.cn/java/jvm/jvm-garbage-collection.html

相关推荐
风象南26 分钟前
Spring Boot 实现文件秒传功能
java·spring boot·后端
橘猫云计算机设计27 分钟前
基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·小程序·django·毕业设计
黑猫Teng30 分钟前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
星河浪人36 分钟前
Spring Boot启动流程及源码实现深度解析
java·spring boot·后端
佩奇的技术笔记37 分钟前
中级:Maven面试题精讲
java·面试·maven
Lizhihao_1 小时前
JAVA-堆 和 堆排序
java·开发语言
极客先躯1 小时前
高级java每日一道面试题-2025年3月21日-微服务篇[Nacos篇]-什么是Nacos?
java·开发语言·微服务
工业互联网专业1 小时前
基于springboot+vue的动漫交流与推荐平台
java·vue.js·spring boot·毕业设计·源码·课程设计·动漫交流与推荐平台
雷渊1 小时前
深入分析Spring的事务隔离级别及实现原理
java·后端·面试
rebel1 小时前
Java获取excel附件并解析解决方案
java·后端