JVM体系概述
GC的作用域
- 方法区
-
常见的垃圾回收算法
引用计数
复制
标记清除
标记整理
JVM垃圾回收的时候如何确定垃圾?什么是GC Roots?
什么是垃圾?
如何判断一个对象是否可以被回收?
引用计数法
java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。
因此,一个简单的方法是通过引用计数来判断一个对象是否可以回收。简单来说,就是给对象添加一个引用计数器。
每当有一个地方引用它,计数器值加1
每当有一个地方失效时,计数器值减1
任何时刻计数器值为0的对象就是不可能再被使用的,那么这个对象就是可回收对象。
主流JVM没有才哟个这种算法,最主要的原因是很难解决对象之间相互循环引用的问题。根可达算法
即枚举根节点做可达性分析。
基本思路就是通过一系列名为GC roots的对象作为起始点,从这个对象开始向下搜索,如果一个对象到GC roots没有任何引用链相连时,则说明此对象不可用。能够遍历到的对象判定为存活。没有遍历到的自然不可达。哪些对象可以作为GC Roots?
虚拟机栈(栈帧种的局部变量区,也叫局部变量表)中的引用对象
- 方法区中的类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(Native方法)引用的对象