美文网首页
jvm- 垃圾回收-01检测对象是否可用

jvm- 垃圾回收-01检测对象是否可用

作者: 我是陈炜 | 来源:发表于2019-11-23 12:12 被阅读0次

hotspot中 决定一个对象是否可用的 是根搜索算法

根搜索算法

基本思路:通过一系列GCROOT作为起始点,这些节点开始向下搜索,搜索过的路径 称为引用链,当一个对象和GCROOT之间没有任何引用链时,则证明对象是不可用的。

如下图所示 ,ObjectA,ObjectB,ObjectC为可用,ObjectD与ObjectE不可用


根搜索算法

GC ROOT对象

  • 虚拟机栈(栈帧的本地变量表)中的引用的对象。
  • 方法区中的类静态属性引用的对象。
  • 方法区中的常量引用的对象。
  • 本地方法栈中JNI(Native方法)的引用的对象。

如何获得GCROOT对象

如果每次都完全遍历方法区和栈,逐个检查其引用关系,那么 每次都会消耗很多时间。
另外 可达性分析对执行时间的敏感还体现在gc停顿上,因为这项工作必须在保持同一个版本号(引用关系不变)的快照中进行。
由于目前主流的java虚拟机都是精准式gc(知道一块内存是对象还是引用),所以当执行系统停顿,并不需要一个不漏地检查完所有上下文和全局的引用位置。

hotsot是通过一组oopmap的数据结构来达到这个目的的,在类加载完成的时候,hotspot就把对象内什么偏移量上是什么类型的数据计算出来,在jit编译中,也会在特定的位置记录下栈和寄存器中哪些位置是引用。这样,jvm在扫描时可以直接得知这些信息。

这一部分参考文章:找出栈上的指针/引用

如何加速维护oopmap

在oopmap的协助下,hotspot可以较快的完成gc root枚举,但是一个很现实的问题随之而来:可能导致引用关系变化,或者说oopmap内部内容变化的指令非常多,我不可能每次都生成对应的oopmap,那会需要大量空间,同时gc耗时也会增加。

为了解决这一问题。 hotspot做了如下措施:
没有为每条指令生成oopmap,只有在特定的地方记录这些信息,这些信息就是安全点(safepoint),即程序运行时并非所有地方都能停下,必须到safepoint才可以进行枚举根节点。
但是 做了这一措施后又会面临如下问题

  1. 如果safepoint的间隔过长,那么 每次维护oopmap的时间就会很长;
  2. 如果safepoint的间隔过短,吞吐量可能会比较低。

如何到达safepoint

这里还有另外一个问题,我们该采用主动式中断还是抢先式中断:

  1. 抢占式中断:不需要线程的执行代码配合,在维护oopmap发生时,直接把所有线程中断,如果发现有线程中断的地方不在安全点,就恢复线程,让他"跑"到安全点。
  2. 主动式中断:主动式中断是通过维护oopmap需要实现中断线程的时候,不直接操作线程操作,仅仅是设置一个标志,各个线程执行主动轮询这个标志,发现中断标志为真时自己中断挂机。轮询标志的地方和安全点是重合的,另外加上创建对象需要分配内存的地方。

并不是所有线程都可以到达safepoint

并不是所有线程都可以到达safepoint,比如有线程没有执行,如何解决这一问题?

安全区域(safe region)

安全区域是指一段代码片段中,引用关系不会发生变化。在这个区域的任何地方都可以维护oopmap。
在线程执行到safe region的代码时,首先标识自己进入了safe region。这样维护oopmap的时候就不会管这些已经在safe region的线程。
通过这一方法解决了部分线程无法到达safepint 的问题。

相关文章

  • jvm- 垃圾回收-01检测对象是否可用

    hotspot中 决定一个对象是否可用的 是根搜索算法。 根搜索算法 基本思路:通过一系列GCROOT作为起始点,...

  • Java中的GC原理

    Garbage Collection 垃圾收集,GC可以检测对象是否超过作用域从而达到自动回收内存.Java的内存...

  • 【Java垃圾回收器分析】

    前言 垃圾回收器需要回收内存中的数据,以便保持内存一直处于可用状态。但是垃圾回收如何选择哪些数据对象需要回收,哪些...

  • Android 对象池实现原理和简单使用

    了解Android 垃圾回收 判断对象是否可以被回收垃圾收集算法内存分配与回收策略 GC频繁原因 Memory C...

  • JVM-垃圾回收

  • jvm-垃圾回收

    写在前面: 常见面试题: 如何判断对象是否死亡(两种方法)? 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用...

  • JVM-垃圾回收

    JVM的垃圾回收机制指的是对堆中的垃圾对象进行回收。那么我将从三个方面来进行学习和整理,即: 对象被判定为垃圾的标...

  • 不是吧不是吧!现在还有人搞不懂JVM垃圾回收机制?

    一、回收堆区 垃圾回收器在堆进行垃圾回收前,首先要判断这些对象那些还存活,那些已经“死去”。判断对象是否已“死”有...

  • JVM之判断对象的存活状态

    jvm垃圾收集器在进行垃圾回收时,会判断对象是否存活状态,只有死去的对象才会被回收。那么怎么判断对象的存活状态呢?...

  • 学习JVM必不可少的知识

    1.Java垃圾回收机制 对象被判断为垃圾的标准:没有被其他对象引用 2.判断对象是否可被回收 (1)引用计数算法...

网友评论

      本文标题:jvm- 垃圾回收-01检测对象是否可用

      本文链接:https://www.haomeiwen.com/subject/omhxwctx.html