当前位置:首页 > 每日看点 > 正文内容

Ja协程的引入会导致GCRoot枚举复杂度大大增加,JVM是如何解决的呢?

卡卷网12个月前 (01-10)每日看点193

<>Ja协程与GC的爱恨情仇-JVM是如何化解性能危机的?

<>GC本是好好工作,但协程的加入,却让它卷入了一场复杂的性能考验。不过,JVM团队也给出了解决方案,化繁为简,让这对“矛盾CP”握手言和。

<>协程和GC:从爱到“恨”到底发生了什么?

<>GC是如何工作的?

GC(回收器)的核心任务,是清理掉不再使用的对象,释放内存。但在清理之前,GC必须完成一个重要步骤:<>GCRoot枚举,也就是找到程序中所有活跃的引用起点,如:

    <>线程栈帧的局部变量。<>静态变量(全局引用)。<>JNI方法中的本地引用。

传线程中,线程栈是连续的,GC只需扫描每个线程的栈帧即可搞定。<>但是,协程的加入让一切变复杂了!

<>协程的问题在哪?

协程的魅力在于<>挂起和恢复:你可以暂停一个协程,保存当前状态(包括栈帧),稍后在另一个线程上恢复它。问题是,协程的栈帧可能<>脱离线程栈:挂起的协程会把栈帧移到堆中(对,放到GC负责的地方!)。另外协程是<>分散保存的,协程的状态可以被调度器和内存存储,这让GC很难找到所有相关引用。

就像你在图书馆整理书籍(对象),突然有上千个图书员(协程)抱着书四处跑,还随手把书进书架。这对GC来说,简直就是噩梦!

<>JVM是怎么样化解协程与GC的矛盾的?

JVM团队展示了一种很巧妙的设计,可以用几个来概括:

<>1.[断点续传]:精确掌控协程的挂起与恢复

协程可以在任意挂起点暂停,但JVM的Safepoint(安全点)可以帮助GC实时跟踪这些挂起点的位置,就像你看剧时按下的暂停键。具体实现方式包括协程挂起时,<>保存当前栈帧到堆,让GC继续枚举时可以直接从堆访问。以及Safepoint确保挂起作与GC同步,让GC的枚举总是精准无误。

<>通俗点讲:JVM为协程配备了“暂停记录仪”这个神器,无论你在哪里停下,它都能找到你。

<>2.[分批处理]:避免一次性扫描的压力

面对成千上万的协程栈帧,JVM并不会“一股脑全扫完”,而是采用了<>分批处理的策略:

    GC枚举协程栈帧时,会将所有协程分成多个批次,每次处理一个小批量,防止因为协程数量过多导致性能瓶颈。如果处理时间超过设定的阈值(如50ms),GC会暂停并等待下一轮回收。

用伪代码可以这样理解:

for(atch:splitInatches(allCoroutines)){ processatch(atch); if(timeExceeded()){ pause(); continue; } }

这就像图书馆员一次只整理几排书,而不是试图瞬间整理整座图书馆。

<>3.[共享栈]:让协程更轻更快

VirtualThread(虚拟线程)是Ja的最后防线,为了减少内存开销,JVM不为每个协程分配的栈,而是采用<>共享栈模式:协程运行时只使用一个小型栈,当协程挂起时,栈帧被序列化到堆,释放线程资源。

这种设计极大减少了内存压力,也让GC可以直接这些栈帧对象。可以说,JVM通过“共享单车”模式,解决了资源浪费的问题。

<>4.[懒加载]:按需枚举,减少无用扫描

协程的挂起栈帧,并不是在GC开始时就全部加载,而是<>等到需要时才动态枚举。这样做就可以降低GC开销,减少不必要的扫描。

这种“<>按需处理”的思路,和Go语言的协程GC优化设计类似,但Ja的实现更加智能化。


<>为什么说JVM的优化是技术的艺术?

JVM在协程与GC的博弈中达成了“动态平衡”,还是有三板斧的:

    <>栈帧对象化:协程栈帧挂起后直接放到堆中,让GC像普通对象一样协程栈帧。<>调度器协作:协程调度器帮助GC跟踪协程的挂起状态。<>批次处理:分批扫描协程,避免性能过载。

这不仅化解了GC的复杂性,还让协程可以以轻量、高效的方式大规模运行。

一句话:<>JVM的协程GC优化是“让复杂的事情变简单”的设计。Ja的VirtualThread也不只是一个“新玩具”,更是未来高性能并发编程的关键一步。

觉得有帮助的话,记得点赞、收、关注~我是旷野,探索无尽技术!

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/8498.html

分享给朋友:

相关文章

报名的网课分期付款怎么退?

你在你分期付款的订单下面有客服电话,直接打电话描述一下你的问题,你可以告诉他你是被恶意绑定的,在不了解有退学条件这一说的情况下报的课程,可能遇到消费者诈骗了,不承认有退学金,说是霸王条款,诈骗消费者,你若分期了先把自动续费关了,别让自己个人...

有没有高手指点一下Google做SEO现在的技巧啊?心好累。

有没有高手指点一下Google做SEO现在的技巧啊?心好累。

搜索引擎优化 (SEO) 的目标是让 Google 在用户输入相关搜索查询时提供您的网页链接。虽然没有固定的蓝图可以保证您获得最高排名,但有几种 SEO 最佳实践(您可以将其视为 SEO 规则)可以增加您在非付费结果中获得良好排名的机会。谷...

你怎么看待软件测试这个工作的?

你怎么看待软件测试这个工作的?

先说一个插曲:上个月我有同学在深圳被裁员了,和我一样都是软件测试,不过他是平安外包,所以整个组都撤了,他工资和我差不多都是14K。现在IT互联网已经比较寒冬,特别是软件测试,裁员先裁测试,这几乎都是定律。我最近看了某音很多应届生以及去年毕业...

作为一名网络工程师,每天日常工作是什么样的?

作为一名网络工程师,每天日常工作是什么样的?

先介绍下我的基本情况,本人女,不知名的网络工程师一枚,入行也有三四年了。虽然我只在代理商和集成商干过,但怎么也算是“业内人士”一枚,没吃过猪肉总见过猪跑嘛。今天,就以我经历过,或者了解过的网络工程师,来给大家介绍一下到底每天的工作日常是什么...

为什么原来说 7 nm 是半导体工艺的极限,但现在又被突破了?

10年前我们觉得65nm工艺是极限,因为到了65nm节点二氧化硅绝缘层漏电已经不可容忍。所以工业界搞出了HKMG,用high-k介质取代了二氧化硅,传统的多晶硅-二氧化硅-单晶硅结构变成了金属-highK-单晶硅结构。5年前我们觉得22nm...

我怎么也无法理解网络游戏为什么会有外挂?

我怎么也无法理解网络游戏为什么会有外挂?

因为你把服务器想象成了无所不能的上帝;但在我们程序猿眼里,服务器不过是一个黑大傻粗的计算器。比如说,我们在某个位置打开一个宝箱:那么,你觉得,程序背后应该做了些什么呢?一、天真的玩法天真的程序猿会觉得,啊,这事简单!我就告诉服务器,用户ID...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。