JVM学习(三):垃圾回收机制
1.垃圾回收机制的作用
顾名思义,就是用来释放垃圾所占用的内存,防止内存泄漏。有效使用地可使用的内存,对内存堆中已死亡的或者长时间未使用的对象进行清除和回收。它主要针对Java堆和方法区进行回收
2.如何判断一个对象可被回收
-
1.java里通过可达性分析来判定一个对象是否存活,该算法就是通过一系列的“GC Roots”的对象作为起始点,当一个对象到GC Roots没有任何引用链相连时,该对象就是不可用的,会被回收。
如下图:虽然object-5、object-6、object-7之间存在引用,但是它们到GC Roots是不可达的,所以它们会被判定为可回收对象
-
在java语言中,可作为GC Roots的对象包括以下几种:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 方法区中类静态属性所引用的对象
- 方法区中常量引用的对象
- 本地方法中JNI(本地方法)引用的对象
-
2.引用计数算法:
给每个对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1;引用失效后,就减1;在任何时刻计数器为0的对象就是不可能再被使用的,这时候就会被GC判断为可回收对象;但这种方式存在一个缺点,它很难解决对象之间相互循环引用的问题,因此,JVM就没有选用它来管理内存
3.垃圾回收算法
- 标记–清除算法
- 标记–整理算法
- 复制算法
- 分代收集算法
可以看看这篇博客:垃圾回收算法
另外关于Java堆中的分区:新生代(又分成Eden、s0、s区)和老年代,可以参考下面一篇博文