生存还是死亡

对象是否需要被垃圾收集器回收主要有两种方式:引用计数法可达性分析算法

引用计数法

给对象添加一个引用计数器,每当有一个地方引用他的时候,计数器的数值就+1,当引用失效时,计数器就-1;任何时候计数器的数值都为0的对象时不可能再被使用的。

客观的来说,引用计数法实现简单,判定效率高,但是无法解决对象的循环引用的问题。所以现在的虚拟机很少使用这种算法辣判断对象是否存活。

可达性分析算法

基本思路就是:通过一系列称为GC Roots的对象作为起始点,从这些起始点开始向下搜索,搜索所搜过的路径称为引用链Reference Chain,当一个对象到GC Roots没有任何引用链相连接时,则证明此对象时不可用的。如下图所示:4,5就被判定为需要回收的对象

GC Roots

在虚拟机中可作为GC Roots的对象包括以下几种:

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区常量引用的对象
  • 本地方法栈引用的对象

    GC算法

    在被可达性分析算法判定为需要被回收的对象时,需要进行垃圾回收操作,垃圾回收算法有以下几种:

标记清除(mark-sweep)

最基础的收集算法,如同 它的名字一样,算法分为标记清除两个阶段:首先标记出需要被回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实就是上面所讲的可达性分析算法被标记为没有GC roots的引用链。过程如下:

不足
  • 效率问题,标记和清除两个过程的效率都不高
  • 空间问题,标记清除和产生大量不连续的内存碎片,内存碎片过多容易导致以后在程序运行的过程中需要分配大对象时,无法找到足够的连续内存而不得不提前触发一次垃圾收集动作。

    适用场景

    适用于老年代。因为老年代回收的几率小且不频繁能减少内存碎片

    复制 (coping)

    为了解决标记-清除得到效率问题,复制算法就出现了;它的原理是将可用内存容量划分为两个大小相等的内存块,每次只使用其中的一个,当这个的容量用完了。就将还存活的对象复制到另外一块上面去,然后再把已使用过的内存空间全部清理掉。这样使得每次都是对整个半区进行内存回收,内存分配就不用考考虑碎片等复杂情况


    研究表明,新生代中的对象98%都是朝生夕死的,所以按照并不需要1:1来划分空间。而是将内存分为一块较大的Eden空间和两个较小的Survivor空间,每次使用Eden和其中一款Survivor。一般比例是Eden : Survivor = 8:1

    不足
  • 空间利用率只有50%,但是经过适当的调整Eden和Survivor的比例能达到70%
  • 复制收集算法在对象存活率较高时就要进行较多的复制操作,效率将会变低

    适用场景

    使用了对象存活率较低的内存空间,如Eden区。

    标记整理

    是标记-清除算法的升级版本。标记过程任然与标记-清除算法一样,但是后续的处理步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界意外的内存、标记-整理算法示意图如下:

最新文章

  1. IE8/9 JQuery.Ajax 上传文件无效
  2. 基于ABP的应用执行Update-Database出现异常的解决办法
  3. R语言-GA算法脚本
  4. CSS3.0盒模型display:box;的使用
  5. Linux/Unix命令
  6. CLR via C#深解笔记二 - 类型设计
  7. MySQL数据很大的时候
  8. list转datatable c#
  9. mysql外键设置(待测试)
  10. hdfs工作原理
  11. 【M28】智能指针
  12. Thinkphp 表单验证
  13. HDU 4604 Deque 最长子序列
  14. bootstrap 3 のcheckbox-inline
  15. IOS任务管理之GCD使用
  16. 深入理解Redux
  17. 在Spring Boot框架下使用WebSocket实现聊天功能
  18. 【洛谷P2822 组合数问题】
  19. Python学习笔记5程序的控制结构
  20. 【物联网】 9个顶级开发IoT项目的开源物联网平台(转)

热门文章

  1. Java复习(三)类中的方法
  2. SimpleDateFormat 线程安全的解决方案--DateTimeFormatter
  3. 22)PHP,数组排序函数
  4. D. Array Splitting(后缀数组)
  5. Different Integers
  6. [LC] 222. Count Complete Tree Nodes
  7. django框架进阶-cookie和session-长期维护
  8. JSON — Java与JSON数据互转
  9. labview状态机
  10. Nginx笔记总结九:Nginx日志配置