1、垃圾回收(GC)
GC(Garbage Collection,即垃圾回收)的基本原理:将内存中不再被使用的对象进行回收。垃圾回收主要是发生在堆内存里面,在1.8以后FULLGC也会发生在meta space中。
- 对新生代的对象的收集称为minor GC。Minor GC指新生代GC,即发生在新生代(包括Eden区和Survivor区)的垃圾回收操作,当新生代无法为新生对象分配内存空间的时候,会触发Minor GC。因为新生代中大多数对象的生命周期都很短,所以发生Minor GC的频率很高,虽然它会触发stop-the-world,但是它的回收速度很快。
- 对老年代的对象的收集称为major GC。Major GC清理Tenured区,用于回收老年代,出现Major GC通常会出现至少一次Minor GC。
- 程序中主动调用 System.gc() 强制执行的GC为 Full GC。Full GC是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。Full GC不等于Major GC,也不等于Minor GC+Major GC,发生Full GC需要看使用了什么垃圾收集器组合,才能解释是什么样的垃圾回收。
GC 中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java 在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。
2、垃圾定位
在进行垃圾回收之前,需要首先进行垃圾定位,即判断哪些对象可以进行回收。当对象没有被任何引用指向时就可被垃圾回收。
2.1、引用计数法
引用计数法也就是记录当前对象的引用次数,当引用次数为0时则进行回收。给对象添加一个引用计数器,每当有一个地方引用它,计数器值就加一;相反的,当引用失效的时候,计数器值就减一;任何时刻计数器为0的对象就是不可能再被使用的。也就是说,当计时器的数值为0的时候,这个对象就可以被回收了。
引用计数是垃圾收集器中的早期策略,但是引用计数法存在一个巨大的问题,就是循环依赖,例如:
针对上图这种情况,对象ABC之间相互引用,他们的counter永远不可能为0,造成他们永远无法被回收,因此目前主流的 JVM 里都没有选用引用计数算法来管理内存。
示例:
<- 背景 -> 对象objA 和 objB 都有字段 name,两个对象相互进行引用 objA.name = objB; objB.name = objA; <- 问题 -> 当这两个对象objA、objB再也没有其他任何引用时,实际上他们应该要被垃圾收集器进行回收才对
但因为他们相互引用,所以导致计数器不为0,这导致引用计数算法无法通知垃圾收集器回收该两个对象
标签:收集器,对象,回收,理解,GC,引用,JVM,垃圾 From: https://www.cnblogs.com/wenxuehai/p/16631896.html