文章目录

  • 1. 垃圾回收中的安全点
  • 2. 垃圾回收中的安全区域

1. 垃圾回收中的安全点

安全点:程序执行过程中需要进行垃圾回收时,只有在特定的位置停顿下来开始进行GC,这些特定位置称之为安全点(Safepoint)。

Safepoint的选择很重要,如果太少可能导致GC等待用户线程执行的时间太长;如果太多,就是太频繁的执行GC,影响性能。大部分指令执行时间都非常短,通常会根据是否具有让程序长时间执行的特征为标准,比如选择一些执行时间较长的指令作为saftpoint,如方法调用、循环跳转和异常跳转等。

当多个用户线程正在执行时,此时如果要发生GC,如何检查所有用户线程都执行到了最近的安全点停顿下来了呢?分如下两种方式:

  • 抢先中断:GC发生时,首先中断所有的用户线程,如果有用户线程还未执行到安全点处,就恢复线程,让线程跑到安全点处。目前没有虚拟机采用此种形式;
  • 主动式中断:设置一个中断标志,各个线程执行到SafePoint的时候主动轮询这个标志,如果该标志为真,则将自己线程进行中断。

2. 垃圾回收中的安全区域

Safepoint保证了程序执行时,如果发生了GC,需等到程序执行到安全点处开始进入GC。但是如果程序没有执行时呢?比如线程处于sleep状态或blocked状态,此时线程无法响应JVM的中断请求,无法走到安全点去中断挂起线程,JVM也不太可能等待线程被唤醒,否则GC整个过程耗时过长,影响性能。鉴于这种情况,就可以用安全区域(Safe Region)来解决。
Safe Region指在一块代码片段中,对象的引用关系不会发生变化,不会影响到可达对象分析的准确性,这个区域中的任何位置开始GC都是安全的。也可以把Safe Region看做是扩展了的Safepoint。

实际执行时:

  1. 当线程运行到Safe Region代码时,首先标识已经进入Safe Region区域,如果在该区域执行期间发生了GC,JVM会忽略标识Safe Region状态的代码,即JVM执行GC垃圾清理工作,而Safe Region状态的线程也会继续执行,因为该线程不会改变GC ROOTS,不会影响垃圾回收。
  2. 当这个线程即将离开Safe Region区域时,会首先检查JVM是否已经完成GC,如果完成了,则该线程继续执行;如果未完成,该线程必须等待GC完成,等到收到可以安全离开Safe Region的信号为止。

垃圾回收中的安全点与安全区域相关推荐

  1. 53.垃圾回收算法的实现原理、启动Java垃圾回收、Java垃圾回收过程、垃圾回收中实例的终结、对象什么时候符合垃圾回收的条件、GC Scope 示例程序、GC OutOfMemoryError的示例

    53.垃圾回收算法的实现原理 53.1.目录 53.2.启动Java垃圾回收 53.3.Java垃圾回收过程 53.4.垃圾回收中实例的终结 53.5.对象什么时候符合垃圾回收的条件? 53.5.1. ...

  2. Java程序员的日常—— 垃圾回收中引用类型的作用

    在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...

  3. JVM垃圾回收中新生代老生代的问题

    今天看了下Jvm中新生代和老年代的定义和解析,然后看到一篇博,把自己整懵了,还好后面应该是懂了. 首先是我看到的关于新生代和老年代相关的部分 转自https://www.cnblogs.com/gao ...

  4. 垃圾回收中的分代年龄

    为什么CMS里的分代年龄是6而不是15 CMS (Concurrent Mark Sweep) 是一种基于分代的垃圾收集器,其中分代年龄指的是一个对象在年轻代中经历了多少次垃圾收集.在 CMS 中,当 ...

  5. 在java中finalize_在Java垃圾回收中使用finalize()方法

    当垃圾收集器确定不再对特定对象进行引用时,该finalize()方法将由该对象上的垃圾收集器调用.该finalize()方法不需要参数,也不返回值. finalize()给出了演示Java方法的程序, ...

  6. java中对JVM的深度解析、调优工具、垃圾回收

    jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...

  7. 在Hotspot JVM中跟踪过多的垃圾回收

    由于内存泄漏或其他内存问题,经常导致应用程序冻结,仅使垃圾收集器(GC)进程运行失败,试图释放一些空间. 直到看门狗(或沮丧的管理员)重新启动应用程序并且问题从未解决之前,这种情况一直发生. 本文的目 ...

  8. 一文详解java中对JVM的深度解析、调优工具、垃圾回收

    2019独角兽企业重金招聘Python工程师标准>>> jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以 ...

  9. 垃圾回收 内存管理 python

    20220225 https://mp.weixin.qq.com/s/94SmSNEkwmz-Eu-hBUo0Lg Python的内存管理机制 在windows 中直接在任务管理其中关掉python ...

最新文章

  1. Leetcode 83. 删除排序链表中的重复元素
  2. 用Tableau画可调整的树状图(Tree Diagram)
  3. 文件处理之解决使用 feof(c语言)或(fin.eof())出现多读问题
  4. 四十九、深入了解两个并发接口Callable和Runnable的区别
  5. Leetcode--925. 长按键入
  6. shell之case和function
  7. python爬虫:读取PDF
  8. LZW压缩算法解码器实现
  9. Rust: 从csv文件转成kbar的尝试:速度,还有Julia和激情
  10. JAVA映射文件到内存,java之内存映射文件
  11. 浙江省计算机1级考试Excel,浙江省计算机一级考试(2014)Excel试题
  12. python爬虫爬取网易云音乐歌手信息
  13. 【Python计量】参数假设检验
  14. MCAL配置-Cdd_Ipc
  15. blender 51个必须熟练记住的基础操作
  16. ios云信不能全屏_ios集成网易云信IM功能遇到的坑
  17. C语言编程练习:打印九九口诀表
  18. STM32F40xxx 系列芯片引脚图
  19. python 计算快递费
  20. jeep智能手表软件测评中心的测试,智能手表哪款好之Jeep新款智能手表试用测评...

热门文章

  1. C++的TCP套接字编程的基本步骤
  2. java随机数生成_java实现随机数生成器
  3. ACM题目测试数据生成方法
  4. windows10 网速慢——提高网络速度
  5. 《数据仓库与数据挖掘教程》ch02数据仓库原理 章节整理
  6. 基于springboot的社区团购管理系统
  7. python 之pymysql安装问题
  8. oracle主键自增
  9. 一些常用的数学符号,助你网聊数学准确一点
  10. 计算机声音如何处理器,电脑cpu声音很响怎么办 cpu温度过高的解决方案