JVM学习笔记18-垃圾判断算法

1 引用计数算法–Reference Counting

给对象添加一个引用计数器,规定如下

  • 当有一个地方引用它,计数器+1
  • 当引用失效,计数器-1
  • 任何时刻计数器为0的对象就是不能再被使用的

引用计数器无法解决对象循环引用的问题


2 根搜索算法–Root Tracing

  • 在实际的生产语言中(Java, C#等),都是使用根搜索的算法判定对象是否存活
  • 算法的基本思路就是通过一系列的称为GC Roots的点作为起始进行向下搜索,当一个对象到GC Roots没有任何引用链接Reference Chain相连,则证明测对象是不可用的
  • 在Java语言中,GC Roots包括
    • 在VM栈(帧中的本地变量)
    • 方法区中的静态引用
    • JNInative方法中的引用

2.1 枚举根节点

当执行系统停顿下来后,并不需要一个不漏地检查完所有执行上下文和全局的引用位置,虚拟机应当是有办法直接得知哪些地方存放着对象引用.
在Hotspot的实现中,是使用一组称为OopMap的数据结构来达到目的的

2.2 安全点

在OopMap的协助下,Hotspot可以快速且准确的完成GC Roots枚举,但一个很现实的问题随之而来–可能导致引用关系变化,或者说OopMap内容变化的指令非常多,如果为每一条指令都生成对应的OopMap,那将会需要大量额外的空间,这样GC的空间成本将会变得更高

实际上,Hotspot并没有为每条指令都生成OopMap,而是只在特定的位置记录了这些信息,这些位置称为安全点Safepoint,即程序执行时并非在所有地方都停下来开始GC,只有在达到安全点时才能暂停

Safepoint的选定的既不能太少以至于让GC等待太长时间,也不能过于频繁以至于增大运行时的负载.所以,安全点的选定基本上是以是否具有让程序长时间执行的特征为标准选定的—因为每条指令执行的时间非常段短暂,程序不太可能疑问指令流长度太长这个原因而长时间的运行—长时间执行的最明显特征就是指令序列复用,如

  • 方法调用
  • 循环跳转
  • 异常跳转等

所以具有这些功能的指令才会产生Safepoint

2.3 抢占式中断和主动式中断

对于Safepoint,另一个需要考虑的问题是如何在GC发生时让所有线程(这里不包括JNI调用的线程)都"跑"到最近的安全点上在停顿下来,有两种中断

  • 抢占式中断(Preemptive Suspension)
    它不需要线程执行代码主动去配合,在GC发生时,首先把所有线程全部中断,如果有线程中断的地方不在安全点上,就恢复线程,让它跑到安全点上
  • 主动式中断(Voluntary Suspension)
    当GC需要中断线程的时候,不直接对线程操作,仅仅简单的设置一个标志,各个线程执行时主动的去轮询这个标志,发现中断标志位真是就自己中断挂起,.轮询标志的地方和安全点时重合的,另外再加上创建对象需要分配内存的地方

现在几乎没有虚拟机采用抢断式中断来暂停线程从而响应GC事件

2.4 安全区域

在使用Safepoint似乎已经完美解决了如何进入GC的问题,但实际情况却并不一定.
Safepoint机制保证了程序执行时,在不太长的时间就会遇到可进入GC的Safepoint,但如果程序在不执行的时候呢?

所谓程序不执行就是没有分配CPU的时间,典型的例子就是处于Sleep或者Blocked状态,只是就线程无法响应JVM的中断请求,JVM也显然不太可能等待线程重新分配CPU时间,对于这种情况,就需要安全区域Safe Regin来解决了

在线程执行到Safe Regin中代码时,首先标识自己已经进入Safe Regin,那样,当在这段时间JVM所发起的GC时,就不用管标识自己为Safe Regin状态的线程.
在线程要离开Safe Regin时,它要检查系统是否已经完成了根节点枚举(或者是整个GC过程),如果完成了,那线程就继续执行,构造它就必须等待直到收到可以安全离开Safe Regin的信号为止

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值