【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

相关推荐
空空kkk3 小时前
SSM项目练习——hami音乐(二)
java
闻哥3 小时前
深入理解 ES 词库与 Lucene 倒排索引底层实现
java·大数据·jvm·elasticsearch·面试·springboot·lucene
3 小时前
java关于引用
java·开发语言
弹简特3 小时前
【JavaEE04-后端部分】Maven 小介绍:Java 开发的构建利器基础
java·maven
naruto_lnq3 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
2301_765703144 小时前
Python异步编程入门:Asyncio库的使用
jvm·数据库·python
计算机毕设指导64 小时前
基于微信小程序的智能停车场管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
码云数智-大飞4 小时前
零拷贝 IPC:用内存映射文件打造 .NET 高性能进程间通信队列
java·开发语言·网络
懈尘4 小时前
深入理解Java的HashMap扩容机制
java·开发语言·数据结构
indexsunny4 小时前
互联网大厂Java面试实战:从Spring Boot到Kafka的技术与业务场景解析
java·spring boot·redis·面试·kafka·技术栈·microservices