面试题:安全点与安全区域

安全点与安全区域

  • 安全点:
    • 程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才 能停顿下来开始GC,这些位置称为“安全点(Safepoint) ”。
    • Safe Point的选择很重要,如果太少可能导致GC等待的时间太长,如果 太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂, 通常会根据“是否具有让程序长时间执行的特征”为标准。比如:选择一 些执行时间较长的指令作为Safe Point,如方法调用、循环跳转和异常 跳转等。
    • 抢先式中断:( 目前没有虚拟机采用了)
      • 首先中断所有线程。如果还有线程不在安全点,就恢复线程,让线程跑到安全点。
    • 主动式中断:
      • 设置—个屮断标志,各个线程运行到Safe Point的时候主动轮询这个标志, 如果中断标志为真,则将自己进行中断挂起。
  • 安全区域:
    • Safepoint机制保证了程序执行时,在不太长的时间内就会遇到可进入GC 的Safepoint 。但是,程序“不执行”的时候呢?例如线程处十 Sleep状 态或Blocked状态,这时候线程无法响应JVM的中断请求,“走”到安全 点去中断挂起,JVM也不太可能等待线程被唤醒。对于这种情况,就需要安全 区域(Safe Region)来解决。安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的>。我们也可以把Safe Region看做足被扩展的 Safepoint。
    • 实际执行时
      • 当线程运行到 Safe Region的代码时,首先标识己经进入 fSafe Region,如果这段时间内发生GC, JVM会忽略标识为Safe Region状态的线程;
      • 当线程即将离开Safe Region时,会检查]VM是否已经完成GC,如粜完成了,则继续运行,否则线程必须等待直到收到可以安全离开Safe Region的 信号为止。
posted @ 2021-01-13 13:26  天宇轩-王  阅读(215)  评论(0编辑  收藏  举报