JVM体系概述

1648563122(1).png
1648563199(1).png

GC的作用域

  • 方法区
  • 常见的垃圾回收算法

    引用计数

    image.png
    有对象引用加1,没对象引用-1,到0为止说明可以回收。

    复制

    image.png
    没有内存碎片;缺点有点浪费空间,大对象比较耗时。

    标记清除

    优点:节约内存空间
    缺点:产生内存碎片
    image.png

    标记整理

    image.png
    缺点:耗时间比较多
    优点:没有内存碎片

    JVM垃圾回收的时候如何确定垃圾?什么是GC Roots?

    什么是垃圾?

    内存中已经不再被使用的空间。

    如何判断一个对象是否可以被回收?

    引用计数法

    java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。
    因此,一个简单的方法是通过引用计数来判断一个对象是否可以回收。简单来说,就是给对象添加一个引用计数器。
    每当有一个地方引用它,计数器值加1
    每当有一个地方失效时,计数器值减1
    任何时刻计数器值为0的对象就是不可能再被使用的,那么这个对象就是可回收对象。
    主流JVM没有才哟个这种算法,最主要的原因是很难解决对象之间相互循环引用的问题。
    image.png

    根可达算法

    即枚举根节点做可达性分析。
    image.png
    基本思路就是通过一系列名为GC roots的对象作为起始点,从这个对象开始向下搜索,如果一个对象到GC roots没有任何引用链相连时,则说明此对象不可用。能够遍历到的对象判定为存活。没有遍历到的自然不可达。
    image.png

    哪些对象可以作为GC Roots?

  • 虚拟机栈(栈帧种的局部变量区,也叫局部变量表)中的引用对象

  • 方法区中的类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI(Native方法)引用的对象