Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JVM垃圾回收算法实现的方式

JVM垃圾回收算法实现的方式

作者头像
用户4919348
发布于 2019-04-02 03:17:29
发布于 2019-04-02 03:17:29
5480
举报
文章被收录于专栏:波波烤鸭波波烤鸭

  通过前面的介绍我们清楚了JVM中对象是如何判断存活及垃圾回收算法。那么垃圾回收的算法到底是怎么实现的呢?因为HotSpot虚拟机在对对象回收的时候对执行的效率要求是非常严格的,只有这样才能保证虚拟机的高效运行。

垃圾收集算法

枚举根节点

  我们知道可达性分析算法是需要GC Roots对象的,而GR Roots对象的组成是这四种。

序号

类型

1

虚拟机栈(本地变量表)中引用的对象

2

方法区中类静态属性引用的对象

3

方法区中常量引用的对象

4

本地方法栈中JNI(一般说的Native方法)引用的对象

  上图是简单的将GC Roots对象的组成简单的描述了下。清楚了这个之后我们再回到垃圾回收的问题,在很多应用中仅仅方法区就有几百MB,那么如果一个一个检查引用,那么将会非常的消耗时间。而且因为在枚举GC Roots节点时,程序时需要停顿的【Stop The World】(不可以出现分析过程中对象引用关系还在不断变化的情况,这是保证分析结果准确性的基础。)所以我们不可能花费大量的时间去扫描方法区,那么虚拟机是如何实现在不扫描方法区的情况下找到可作为GC Roots的对象呢?

  在HotSpot的实现中,是使用一组称为OopMap的数据结构来达到这个目的的,在类加载完成的时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译(即时编译器)过程中,也会在特定的位置记录下栈和寄存器中哪些位置是引用。这样,GC在扫描时就可以直接从OopMap中获取到GC Roots的对象。而不用一个一个去查找了。(以空间换时间)

安全点

  我们现在已经知道了在OopMap的帮助下我们可以快速的完成GC Roots的枚举,那么这就会出现一个问题:可能导致引用关系变化,或者说OopMap内容变化的指令非常多,如果为每一条指令都生成对应的OopMap,那将会需要大量的额外空间,这样GC的空间成本将会变得很高。那么虚拟机是如何解决这个问题的呢?

  实际上HotSpot也没有为每条指令都生成OopMap,而是只在“特定的位置”记录这些信息,这些位置便被称为安全点(Safepoint)。也就是说,程序执行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。Safepoint的选定既不能太少以致于让GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷。所以,安全点的选定基本上是以程序是否具有让程序长时间执行的特征为标准进行选定的——因为每条指令执行的时间都非常短暂,程序不太可能因为指令流长度太长这个原因而过长时间运行,长时间执行的最明显特征就是指令序列复用,例如方法调用、循环跳转、异常跳转等,所以具有这些功能的指令才会产生Safepoint。

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

中断方式

说明

抢先式中断(Preemptive Suspension)

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

主动式中断(Voluntary Suspension)

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

安全区

  Safepoint机制保证了程序执行时,在不太长的时间内就会遇到可进入GC的Safepoint。但是,程序“不执行”的时候(如线程处于Sleep状态或Blocked状态),这时线程无法响应JVM的中断请求,“走到”安全的地方去中断挂起,这时候就需要安全区域(Safe Region)来解决。

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

  在线程执行到Safe Region中的代码时,首先标识自己已经进入了Safe Region,那样,当在这段时间里JVM要发起GC时,就不用管标识自己为Safe Region状态的线程了。在线程要离开Safe Region时,它要检查系统是否已经完成了根节点枚举(或者是整个GC过程),如果完成了,那线程就继续执行,否则它就必须等待直到收到可以安全离开Safe Region的信号为止。

参考《深入理解Java虚拟机》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年03月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
说说 Linux 的 curl 命令
比如上面的 imlht.com.test,一般情况下你是没有这个证书的,但是你又想测试 10.43.1.101 的 /user 接口,此时可以直接跳过测接口的内容。
仁扬
2023/07/11
2210
linux curl wget 测速
CURL测速 curl -o /dev/null -w "\n DNS 解析域名的时间\n namelookup:"%{time_namelookup}"\n client和server端建立TCP 连接的时间\n time_connect:"%{time_connect}"\n 从client发出请求;到web的server 响应第一个字节的时间\n time_starttransfer:"%{time_starttransfer}"\n client发出请求;到web的server发送会所有的相应数据的
葫芦
2020/04/23
8K0
curl 请求检测各阶段用时
APPCONNECT:从开始计算,应用层(SSL,在TCP之上的应用层)连接/握手完成的耗时
躺平程序员老修
2023/09/05
5040
CURL 那些不太为人知但强大的功能
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2025/03/29
330
CURL 那些不太为人知但强大的功能
curl测试网页响应时间&指定hosts
curl -o /dev/null -s -w '%{time_connect}:%{time_starttransfer}:%{time_total}\n' 'http://kisspeach.com'
用户1168904
2021/05/21
2.4K0
使用CURL检测Clinet侧发起的HTTP请求各阶段时间
上周,我方的一个客户反馈,访问我们的接口,平均耗时在2s以上。但是我方对请求进入,和请求返回,整个过程都有监控,我方的耗时基本在50ms以内,非常快。
保持热爱奔赴山海
2019/09/17
1.6K0
使用CURL检测Clinet侧发起的HTTP请求各阶段时间
curl命令查看响应时间
curl -w "%{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}" -X GET "http://IP地址+端口/?参数" curl -w "%{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}" -X POST -H "Content-Type: application/json" -d '{"test1":"hah","test2":"qwe","test3":"111"}' "http://IP地址+端口/?参数"
oktokeep
2024/10/09
1560
Linux - curl -w 参数详解
当 curl 没有指定 -L、--location 参数跟随重定向时,此变量将显示重定向实将跳转的实际 URL
小菠萝测试笔记
2021/06/17
5.6K0
Linux - curl -w 参数详解
curl 命令常用场景
curl 命令向 www.qq.com 发出 GET 请求,服务器返回的内容会在命令行输出。
Yorkyu
2022/03/22
5900
curl 命令常用场景
Curl命令分析接口耗时
Curl是一个非常实用的,用来与服务器之间传输数据的工具,支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),Curl设计为无用户交互下完成工作。   Curl提供了一大堆非常有用的功能,包括代理访问、用户认证、Ftp上传下载、HTTP POST、SSL连接、Cookie支持、断点续传 。。。
Luga Lee
2021/12/09
7.3K0
Curl命令分析接口耗时
记几个Curl工具使用技巧
1. 输出内容自动换行: curl  -w "\n"  https://www.seekerhcl.cn/ ---- 2. 指定网卡作为出口: curl --interface eth0 ip.sb 或 curl --int 192.168.0.10 ip.sb (此处IP是网卡对应IP地址) ---- 3. 打印请求站点的耗时情况: curl -o /dev/null -s -w %{http_code}::%{time_namelookup}::%{time_connect}::%{time_start
大大大黑白格子
2020/06/10
2.6K0
curl 查看时间
请求: curl -o /dev/unll -s -w "\n"HTTP返回码:%{http_code}"\n"对端IP地址:%{remote_ip}"\n"应用建连时间:%{time_appconnect}"\n"TCP连接时间:%{time_connect}"\n"DNS解析时间:%{time_namelookup}"\n"准备传输时间:%{time_pretransfer}"\n"开始传输时间:%{time_starttransfer}"\n""\n"总时间:%{time_total}"\n" https://www.baidu.com 返回: HTTP返回码:200
22
2020/11/18
4.3K1
CDN排障系列:curl的高级使用姿势
curl 是一个功能非常强大的开源软件,支持FTP,HTTP,HTTPS,Telnet等多种协议。对于运维、开发同学来说,它是工作中不可缺少的排障利器。它的基本使用姿势请参考文档https://cloud.tencent.com/developer/article/1419809
淡淡的味道
2019/07/05
1.1K0
CDN排障系列:curl的高级使用姿势
使用 cURL 对Web请求进行性能测试
在做 Web 开发的时候,经常需要对 Web Page 或者 REST-ful API 做简单的 Benchmark。本文将介绍如何使用 cURL 进行简单快速的性能评测。本文内容分为以下两部分:
Debian中国
2018/12/21
2.9K0
使用 cURL 测量网站响应时间
内容整理自:https://blog.cloudflare.com/a-question-of-timing/,其中还有 chrome 的测量方式,有兴趣的朋友可以看一下。
dys
2018/11/30
2K0
使用 cURL 测量网站响应时间
将HTTP请求对象转成curl命令行
基本思路是复制浏览器请求为curl命令行,然后解析命令行组装成HttpRequestBase对象,然后结合FunTester性能测试框架进行测试。
FunTester
2021/03/11
2.7K0
【linux命令讲解大全】148.curl命令:命令行文件传输工具(下)
使用curl选项-u可以完成HTTP或者FTP的认证,可以指定密码,也可以不指定密码在后续操作中输入密码:
全栈若城
2024/03/02
3570
比 man 更强悍的命令行工具 cheat
相信你在技术文章里经常会看到 TL;DR 即Too Long; Didn’t Read. 太长不看, man curl 的内容就是太长了,我不看。
苏生不惑
2019/08/18
9000
Linux Curl 命令满足你的工作需求!简直不要太香了
Curl 是基于 URL 语法在命令行方式下工作的文件传输工具,它支持 FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。
Wu_Candy
2022/07/05
4250
踩了个DNS解析的坑,但我还是没想通
最近踩了个DNS解析的小坑,虽然问题解决了,但排查过程比较曲折,最后还是有一点没有想通,整个过程分享给大家。
龟仙老人
2022/04/12
3.4K1
相关推荐
说说 Linux 的 curl 命令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文