精华内容
下载资源
问答
  • 关于安全点和安全区域

    千次阅读 2020-01-05 00:10:32
    安全点 安全点,即程序执行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。Safepoint的选定既不能太少以至于让GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷。 安全点的初始目的并...

    安全点

    安全点,即程序执行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。Safepoint的选定既不能太少以至于让GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷。

    安全点的初始目的并不是让其他线程停下,而是找到一个稳定的执行状态。在这个执行状态下,Java虚拟机的堆栈不会发生变化。这么一来,垃圾回收器便能够“安全”地执行可达性分析。只要不离开这个安全点,Java虚拟机便能够在垃圾回收的同时,继续运行这段本地代码。

    程序运行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。安全点的选定基本上是以程序“是否具有让程序长时间执行的特征”为标准进行选定的。“长时间执行”的最明显特征就是指令序列复用,例如方法调用、循环跳转、异常跳转等,所以具有这些功能的指令才会产生Safepoint。

    为什么把这些位置设置为jvm的安全点呢,主要目的就是避免程序长时间无法进入safepoint,比如JVM在做GC之前要等所有的应用线程进入到安全点后VM线程才能分派GC任务 ,如果有线程一直没有进入到安全点,就会导致GC时JVM停顿时间延长。比如写了一个超大的循环导致线程一直没有进入到安全点,GC前停顿了8秒。

    对于安全点,另一个需要考虑的问题就是如何在GC发生时让所有线程(这里不包括执行JNI调用的线程)都“跑”到最近的安全点上再停顿下来。

    两种解决方案:

    抢先式中断

    抢先式中断不需要线程的执行代码主动去配合,在GC发生时,首先把所有线程全部中断,如果发现有线程中断的地方不在安全点上,就恢复线程,让它“跑”到安全点上。现在几乎没有虚拟机采用这种方式来暂停线程从而响应GC事件。

    主动式中断

    主动式中断的思想是当GC需要中断线程的时候,不直接对线程操作,仅仅简单地设置一个标志,各个线程执行时主动去轮询这个标志,发现中断标志为真时就自己中断挂起。轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方。

    安全点应用场景

    1. GC STW
    2. 偏向锁释放
    3. 其他

    安全区域

    安全点机制保证了程序执行的时候,在不太长的时间就会遇到可进入gc的安全点。但是如果线程处于sleep状态或者blocked状态的时候,这时线程无法响应jvm的中断请求,就需要安全区域。

    安全区域是指在一段代码片段中,引用关系不会发生变化,在该区域的任何地方发生gc都是安全的
    当代码执行到安全区域时,首先标示自己已经进入了安全区域,那样如果在这段时间里jvm发起gc,就不用管标示自己在安全区域的那些线程了,在线程离开安全区域时,会检查系统是否正在执行gc,如果是那么就等到gc完成后再离开安全区域。

    展开全文
  • JVM安全点详解

    千次阅读 2019-06-09 19:17:43
    1、安全点是什么? 在虚拟机在进行可达性分析时,HotSpot虚拟机会在特定的位置记录在哪有引用,这些特定的位置就叫做安全点。 2、安全点的作用是什么? 上边已经说过了,在Oomap的帮助下,HotSpot虚拟机很快就...

    1、安全点是什么?

    在虚拟机在进行可达性分析时,HotSpot虚拟机会在特定的位置记录在哪有引用,这些特定的位置就叫做安全点。

    2、安全点的作用是什么?

    上边已经说过了,在Oomap的帮助下,HotSpot虚拟机很快就完成了GC Roots枚举,但是我们不可能给每一个指令都声成对应的OoMap,那样会造成大量的内存浪费,安全点的作用就是来表示程序执行到安全点时,可以看作冻结状态,因此安全点选定的既不能太少,导致GC等待时间变长,也不能太多,造成系统的负荷。但是大部分的指令执行都很快,程序长时间执行最显著的特征就是“指令复用”,例如循环。

    3、如何实现在GC发生时使线程在安全点进入冻结状态?

    有两种方案:抢先式中断、主动式中断

    抢先式中断:抢先式中断指的是在GC发生时,现将所有线程都中断,然后再检查没有到安全点的线程恢复执行到安全点。

    主动式中断:主动式中断指的是在GC需要中断线程时,不直接操作线程,只是置一个标志,让所有线程去轮询这个标识为,当标志为真时则自己中断挂起,轮训标志的地方和安全点是重合的,另外再加上创建对象所需要分配内存的地方。

    4、安全区域

    上边的safepoint看似已经完美的解决了,GC时如何处理线程的问题,但是如果说线程处于Sleep或者Block状态呢,他是不能响应中断的,因此无法完成走到安全点挂起这一操作,因此安全区域的概念出来了,即在该区域内任何位置开始GC都是可以的。

    展开全文
  • 有办法,就是此处的安全点和安全区域。 1.什么是安全点Safe Point 程序执行时并非在所有地方都能停顿下来开始GC , 只有在特定的位置才能停顿下来开始GC , 这些位置称为“ 安全点(Safepoint)。 2.安全点的选择 ...
    • 问题的提出:JVM的GC实在任何时刻都会发生吗?
    • 先给出答案:不是的,只有stw(stop the world)即用户线程停下来后才会执行,那么用户线程千千万,如何治理呢?有办法,就是此处的安全点和安全区域。

    1.什么是安全点Safe Point

    程序执行时并非在所有地方都能停顿下来开始GC , 只有在特定的位置才能停顿下来开始GC , 这些位置称为“ 安全点(Safepoint)。

    2.安全点的选择

    安全点的选择很重要, 如果太少可能导致GC 等待的时间太长, 如果太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂,通常会根据“ 是否具有让程序长时间执行的特征” 为标准。比如: 选择一些执行时间较长的指令作为safe Point ,如:

    • 循环的末尾
    • 方法临返回前
    • 调用方法之后
    • 抛异常的位置

    3. GC时线程的中断策略

    如何在GC生时, 检查所有线程都跑到最近的安全点停顿下来呢?

    • 抢先式中断: ( 目前没有虚拟机采用了)
      首先中断所有线程。如果还有线程不在安全点, 就恢复线程, 让线程跑到安全点。
    • 主动式中断:
      设置一个中断标志, 各个线程运行到Safe Point的时候主动轮询这个标志,如果中断标志为真, 则将自己进行中断挂起。(客栈门上安装了一个显示器,上面会显示ture,或者false。如果系统需要垃圾回收,就会更新这个状态为true,线程到了客栈后看到为true,就进店别别出来了。)

    4.安全区域Safe Region

    1. SafePoint 机制保证了程序执行时, 在不太长的时间内就会遇到可进入GC的safepoint 。但是, 程序“ 不执行” 的时候呢? 例如线程处于Sleep 状态或Blocked 状态, 这时候线程无法响应JVM的中断请求, “ 走” 到安全点去中断挂起,JVM也不太可能等待线程被唤醒。对于这种情况, 就需要安全区域(Safe Region) 来解决。

    2. 安全区域是指在一段代码片段中, 对象的引用关系不会发生变化, 在这个区域中的任何位置开始GC 都是安全的。我们也可以把Safe Region 看做是被扩展了的Safepoint

    5.安全区域Safe Region-执行流程

    实际执行时:
    1 、当线程运行到 Safe Region 的代码时, 首先标识己经进入了safe Region ,如果这段时间内发生GC ,JVM会忽略标识为 Safe Region 状态的线程(认为它是安全的):
    2 、当线程即将离开时, 会检查JVM是否己经完成GC , 如果完成 , 则继续运行, 否则线程必须等待直到收到可以安全离开Safe Region 的信号为止。

    • 一句话,睡觉可以,请先进入酒店再睡觉,并且进去是在屏幕上说一声我进入安全区域了,在睡觉。这样做的目的就是当要GC的时候不至于找不到你,如果看到屏幕上有你这个线程的名字,就知道你是安全的,就会忽略你;
    • 你(线程)睡醒了要出门了。抬头看看大屏幕是不是安全在出去(true),如果不安全(false)就在酒店待着,别出门,等到gc完成后,状态变为false在出门。
    展开全文
  • 【JVM】安全点与安全区域

    千次阅读 2021-03-09 21:11:28
    安全点 安全区域 总结 概述 我们都知道写JAVA程序的时候不需要关心内存垃圾的回收,而JVM的垃圾收集器会帮我们做这件事情;而且在垃圾回收期执行垃圾回收的时候,都需要有一段STW时间;但是有没有想过为什么垃圾...
    • 概述
    • 安全点
    • 安全区域
    • 总结

    概述

    • 我们都知道写JAVA程序的时候不需要关心内存垃圾的回收,而JVM的垃圾收集器会帮我们做这件事情;而且在垃圾回收期执行垃圾回收的时候,都需要有一段STW时间;但是有没有想过为什么垃圾收集器可以控制所有的用户线程STW呢?而且有的垃圾收集器在某些情况下可能STW时间特别长(几十秒,例如CMS在并发收集失败后转而使用Serial垃圾收集器单线程收集时),用户代码停顿那么久真的不会出问题吗,万一正在进行一些事务操作或者数据库操作怎么办?
    • 其实说到这大家可以想象到我们的计算机内部,CPU同时处理线程数也是固定的,而对于操作系统而言,用户线程肯定远远大于CPU可以同时处理的线程数量的,CPU可以分片执行,轮流将用户线程挂起,那么JVM是否也可以有类似的机制呢?这就可以用安全点和安全区域来解决;

    安全点(Safepoint)

    • 安全点就是代码中的某个位置,在这个位置不会影响代码的部分原子性操作,不可分割的操作等;当线程运行到这些位置时它的状态是确定的,可以被挂起;而当垃圾收集器想执行GC的时候,就会在某个位置给点某个标记,而用户线程在执行到安全点的时候,就会通过这个标记来判断我现在需不需要挂起,如果需要,就立即挂起;而当所有的用户线程都挂起成功后,GC线程开始执行,这就是STW;
    • 而由于程序每次执行到安全点都需要去通过标记判断自己当前需不需要挂起,因此看起来是一个比较影响性能的操作,不能将安全点设置太多;但是如果设置太少,好像垃圾收集器又会等很久才能开始垃圾收集操作,也不太好;JVM基于经验,在这几个点设定了安全点:
      • 1.方法返回之前
      • 2.调用某个方法之后
      • 3.抛出异常的位置
      • 4.循环的末尾

    安全区域(Safe Region)

    • Safe Region 是指在一段代码片段中,引用关系不会发生变化。在这个区域内的任意地方开始 GC 都是安全的;比如说,线程在Sleep的时候;
    • 当这样的代码执行到安全区域时,首先标示自己已经进入了安全区域,那样如果在这段时间里JVM发起GC,就不用管标示自己在安全区域的那些线程了;如果正好GC在STW时这样的用户线程离开了安全区域,会先检查JVM是否是GC的STW时间,如果是那么就等到STW完成后再离开安全区域;

    总结

    • 安全点与安全区域可以与我们操作系统的中断操作联合起来理解,对垃圾收集器来说是非常重要的一部分。
    展开全文
  • 【译文】 GC 安全点 和安全区域

    千次阅读 2017-05-06 11:06:41
    GC安全点与安全区域
  • 17.安全点与安全区

    千次阅读 2018-04-08 17:33:40
    安全点:作用:解决在枚举根节点时引用关系变化的问题特征:是否具有让程序长时间执行的特征条件:指令序列复用,如方法调用、循环跳转、异常跳转什么是safepointsafepoint可以用在不同地方,比如GC、Deoptimization...
  • 安全点(Safepoint) 1、概念:程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint) 2、SafePoint的选择很重要,如果太少可能导致GC等待的时间太长...
  • 安全点: 1.什么是安全点: 在特定的某些地方记录了 oopmap数据结构【记录引用关系信息】,这些特点的地点叫做 安全点。 参考:【从线程角度看,safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程...
  • Java-JVM-安全点SafePoint

    千次阅读 2018-12-19 15:22:33
    Java-JVM-安全点SafePoint 摘要 本文简单记录下安全点概念,因为说多了我也不懂- - 有空的时候再看资料补充下。 0x01 安全点是什么 OpenJDK官方定义如下: 安全点是在程序执行期间的所有GC Root已知并且所有...
  • JVM中的安全点

    千次阅读 2019-04-24 15:36:57
    什么是安全点? 在 JVM 中如何判断对象可以被回收 一文中,我们知道 HotSpot 虚拟机采取的是可达性分析算法。即通过 GC Roots 枚举判定待回收的对象。 那么,首先要找到哪些是 GC Roots。 有两种查找 GC Roots 的...
  • JVM虚拟机如何枚举根节点:原理、安全点和安全区域 枚举根节点——可作为GC Roots的节点 可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表) 枚举根节点——...
  • GC(1.安全点的相关知识)

    千次阅读 2016-10-03 15:10:32
    1.安全点的相关知识 1.1 OOPMap 2. GC基本算法 3. G1算法 4. 通过Reference和GC交互 5. GC友好编程安全点的相关知识主要有如下几个问题: 1.什么是安全点 2.安全点的位置 3.安全点的管理、实现 4.什么...
  • 抢占式中断:它不需要线程的执行代码主动去配合,在GC发生时,首先把所有线程全部中断,如果有线程中断的地方不在安全点上,就恢复线程,让它“跑”到安全点上。 主动式中断:当GC需要中断线程的时候,不直接对...
  • 为什么发生GC的时候要让所有的线程都运行到安全点(Safepoint)处呢?不能在当前执行的地方停下来就好吗? 换句话说,就是为什么要有安全点的存在? 设置安全点的目的是什么? 安全点一般是设置在指令序列复用的地方...
  • JVM SafePoint安全点分析

    千次阅读 2017-09-24 11:13:29
    什么是safepointsafepoint可以用在不同地方,比如GC、...从线程角度看,safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,
  • 深入学习JVM-JVM 安全点和安全区域

    千次阅读 2018-06-01 11:51:00
    显然不能随意设置全局变量,进入安全点有个默认策略那就是:“避免程序长时间运行而不进入Safe Point”,程序要GC了必须要等线程进入安全点,如果线程长时间不进入安全点这样就比较糟糕了,因此安全点主要咋以下位置...
  • 清除算法2.2 标记-复制算法2.3 标记-整理算法三、HotSpot的算法细节实现3.1 根节点枚举3.2 安全点如何在垃圾收集时让所有线程跑到最近的安全点停顿下来3.3 安全区域原理3.4 记忆集与卡表3.4.1 记忆集的实现卡表3.5 ...
  • jvm 垃圾回收机制 安全点

    千次阅读 2017-07-24 14:15:32
    上一节,我们说到 jvm 保洁...在可达性分析中要分析哪个对象没有引用的时候,必须在一中快照的状态进行,就是这个所有的线程都被冻结了;不可以出现分析过程中对象引用关系还在不停的变化;如果该不能满足的话,
  •  “抢先式中断”不需要线程的执行代码去主动配合,在GC发生时,首次会把所有的线程全部中断,如果发现有些线程中断点不是安全点,就恢复该线程直到安全点上停止。”主动式中断“实际上就是线程主动轮询的一个过程,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,804
精华内容 23,921
关键字:

安全点