【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

相关推荐
吾日三省吾码2 小时前
JVM 性能调优
java
弗拉唐3 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi773 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
少说多做3434 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀4 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20204 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深4 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
shuangrenlong4 小时前
slice介绍slice查看器
java·ubuntu
牧竹子4 小时前
对原jar包解压后修改原class文件后重新打包为jar
java·jar