社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
关键词联想:(类型)堆和非堆,(人类成长)伊甸园-幸存者乐园-养老园 (垃圾分类) 可达性 和标记 (垃圾清理)标记清理 空间to 复制 All 标记整理 more 分代回收
Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆。 ##
所有类实例和数组的内存均从此处分配,由垃圾回收器的自动内存管理系统回收
JVM留给自己用的,包含方法区、JVM内部处理或优化所需的内存(如 JIT Compiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码。
来一张图有助于记忆
伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。
幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
终身颐养园(Old Generation):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。
ok,在看看垃圾收集的思路第一条发现无用信息对象
堆中每个对象实例都有一个引用计数。
当一个对象被创建时,且将该对象实例分配给一个变量,该变量计数设置为1。
当变量被赋值给其他对象时,计数加1(a = b,则b引用的对象实例的计数器+1)
但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1。
任何引用计数器为0的对象实例可以被当作垃圾收集。
当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1
优缺点
public class Main {
public static void main(String[] args) {
MyObject object1 = new MyObject();
MyObject object2 = new MyObject();
object1.object = object2;
object2.object = object1;
object1 = null;
object2 = null;
}
}
最后面两句将object1和object2赋值为null,也就是说object1和object2指向的对象已经不可能再被访问,但是由于它们互相引用对方,导致它们的引用计数器都不为0,那么垃圾收集器就永远不会回收它们。
这个算法比较像树,从根节点出发寻找下一个节点(引用),如果无法被寻找的节点被,清理掉!他的出现解决了循环引用的问题
java中可作为GC Root的对象
过程
分标记阶段,清除阶段,其实标记阶段应该就是用了可达性分析算法,如果可达就标记,后面清除未标记的
优缺点:
优点:简单,容易实现
缺点:容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。
它的出现就是解决空间利用率不足的问题,所以第一步分区域
活动区:
在任意时间点,所有动态分配的对象都只能分配在活动区
空闲区:
当活动区快接近full的时候,触发GC,将存活的从活动区转移到空闲区,当然这个时候他们两的意义就交换了
优缺点
他才是标记清理算法的升级版,不用多说了,就是多了一个步骤整理
优缺点
他则是copy+Mark-Compact整合版
你先想想之前两个回收算法的总结,就会很快明白分代回收的原理
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!