JVM学习笔记-垃圾回收之安全点与安全区域

安全点

  1. 程序只有在特定位置才能进行GC,这些位置被称为安全点。
  2. 安全点的选定基本上是以程序“是否具有让程序长时间执行的特征”为标准进行选定的(方法调用、循环跳转、异常跳转等)
  3. 安全点太少可能导致GC等待时间太长,太频繁会影响系统性能。
  4. 如何判断发生GC时所有线程是否都在安全点上
    - 主动式中断:设置一个中断标志,当线程走到此位置时,判断标志是否为真,如果为真则将自己挂起等待GC
    - 抢先式中断:当GC发生时中断全部线程来判断是否都在安全点上,恢复不在安全点上的线程让他跑到安全点上(没有虚拟机使用这种方式,太暴力)

安全区域

  1. 安全区域的存在是为了解决线程一直未进入安全点(sleep或block状态时,JVM不能唤醒线程让其走到安全点)
  2. 安全区域是指在一段代码中,对象的引用的关系未发生变法,在这个区域内的任何时候进行GC都是安全的
  3. 实际执行时
    - 当进入安全区域时,标识线程已经进入安全区域,如果这段时间内发生GC,则JVM会忽略这个标识
    - 当即将退出安全区域时,还未发生GC,则等待JVM发出可以推出安全区域的信号才能继续退出。

你可能感兴趣的:(JVM,java,jvm,垃圾回收)