关于垃圾回收的小结

来源:互联网 发布:mac 命令行 删除软件 编辑:程序博客网 时间:2024/05/21 18:31

垃圾回收主要是针对堆这个区域的,而堆主要是存放对象。

在进行垃圾回收的时候该如何判断对象是否已经死亡呢,通常有两种方式:引用计数法和发达性分析算法

引用计数法就是给对象添加一个引用计数器,每次有一个地方引用它时,计数器的值就加一,当引用失效时,计数器的值就减一。任何时刻计数器的值为0的对象就是不可以在被使用的对象了。但是这个算法很难解决对象之间相互循环引用的问题。

可达性引用:就是通过一系列的称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明该对象是不可用的。

GC Roots包括:虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、方法去中常量引用的对象、本地方法栈中JNI(一般说的Native方法)引用的对象。


垃圾回收算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法

堆一般分为新生代和老年代。新生代又分为Eden区、和两个Survivor区。新生代中,每次垃圾回收时发现都会有大量的对象死去,只有少量的对象会存活,那就选用复制算法,只需要付出少量的存活对象的复制成本就可以完成收集。而老年代中对象的存活率比较高,没有额外的空间对它进行担保,就必须使用标记-清除或者标记-整理算法。

内存分配策略:

对象优先在Eden区分配、大对象直接进入老年代、长期存活的对象进入老年代、动态的年龄判断、空间分配担保。

0 0
原创粉丝点击