垃圾回收基础
- 垃圾回收基础:什么是垃圾、如何判定是垃圾、如何回收
- 根搜索算法、应用分类、GC类型、垃圾收集类型
什么是垃圾:简单来说就是内存中已经不再被使用到的内存空间就是垃圾
引用计数法:给对象添加一个引用计数器,有访问就加1,应用失效就减1
(比0大,就说明还有人在应用)
优点:实现简单、效率高;
缺点:不能解决对象之间循环引用问题
(商用虚拟机中不会使用这个方法)
根搜索算法(主流商用虚拟机使用方法)
从跟(GC Roots)节点向下搜索对象节点,搜索走过的路径称为引用链,当一个对象到根之间没有连通的话,则对象不可用
可以作为GC Roots的对象包括:虚拟机栈(栈帧局部变量)中引用的对象、方法区类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI引用的对象
(所有被synchronized关键字持有的对象、反应虚拟机内部情况JMISBIN、本地的代码缓存所持有的的对象)
HotSpot使用了一组叫做OopMap的数据结构达到准确式GC的目的
(OopMap用来描述对象之间引用关系的一种数据结构)
在OopMap的协助下,JVM可以很快的做完GC Roots枚举,但是JVM并没有为每一条指令生成一个OopMap
如果为每一条指令生成OopMap,会增加很多额外的空间。
HotSpot解决方法:
记录OopMap的这些“特定位置”被称为安全点,即当前线程执行到安全点后才允许暂停进行GC
安全点 === SafePoint
如果一段代码中,对象引用关系不会发生变化,这个区域中任何地方开始GC都是安全的,那么这个区域被称为安全区域。