首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

仓颉语言文档中关于GC的描述,显得有点盲目夸大

之前看了仓颉语言官方文档中关于GC的描述,一直感觉文档只写了一半,只说了自己GC特别牛B,但是后续介绍了一些安全点、内存屏障还有两次标记算法等这些已经被java玩烂的理论,完全支持不起来开头所说的优势。本文其实我很早都想发了,但想着仓颉文档是刚放出来,后续应该还会继续细化文档,把GC上的创新点讲出来,但是等了这么久也没见文档有什么更新,所以还是先发出来和各位探讨一下。

仓颉对于自己GC优势的描述

   文档讲述:“仓颉提供全并发的内存标记整理 GC 算法作为其自动内存管理技术的底座,具有延迟极低、内存碎片率极低、内存利用率高的优势。”。初看起来仓颉语言应该是GC方面做了很多创新,之后讲述也都是为了证明“并发内存标记整理”的优势。下面也配图描述了并行的图示。举例说并发内存标记可以解决120Hz高刷屏下的渲染程序问题。

然后说了:“能实现如此高效的 GC 同步主要基于以下两点关键要素点:安全点和内存屏障”。这里实在是把我看纳闷了,这俩要素不是实现GC的最基本要求么,跟高效不高效到底有什么关系?从开始的结论到后面的图片再到这两点要求,根本就不挨着。而且举例子的120Hz高刷问题完全看不出来和论据到底有什么关系,而且这问题java在早很多年的gc优化中不是早都解决了么。

主流GC概述

   为了给大家讲清楚其中的问题,这里还是简单的讲一下现在最主流的GC架构,主要讲GC和线程以及被GC对象的关系。我们不会去讲计数引用、根部可达、多次标记等等算法细节,因为这些是GC的实现手段,大同小异,因为这些算法的微创新对于GC整体性能的影响是有限的。

当前主流的GC架构由以下几种方式组合实现。

用户线程内的GC,保证栈内存及时释放

如果一个对象其控制权限只在本线程内,其他线程都不会访问。那么这类对象都属于此类GC要处理的对象。

这里只需要在业务代码执行的间隙插入一些gc检测点就可以完成对象的释放,此类对象的内存占用大部分是在栈上的。线程内的GC消耗是很低的,根本不用考虑间隔问题,GC点的添加也是多多益善,像计数引用这个级别的GC算法足以支撑此场景。所以所谓的120Hz高刷渲染问题,90%以上所使用的内存都会被此类gc方式捕获释放,也不会成为什么GC性能瓶颈。

运行时GC线程,保证堆内存及时释放(不包括循环引用问题)

如果一个对象其控制权限属于多个线程,那么就无法在特定线程内释放它,这里它的释放归属权就需要放到运行时的GC线程上。

如上图可以看出来,对象A和对象B同时被3个线程访问,但是其访问的数据不同,线程1和2是访问对象的业务数据,当不再使用时,会对象A和对象B做标记。GC线程访问的是对象A和B的标记,当检测到对象已经不被其他线程使用时,释放对象。GC线程的消耗也是很小的,不需要考虑间隔问题,因为和业务线程都是并行处理,完全不会影响程序的执行效率。这里用一些标记GC算法甚至说计数引用算法也完全满足此场景。

STW与GC,解决循环引用问题

STW全称是stop the world,停止全部业务线程工作。从有GC这个概念开始,所有的优化目标都是如何在不做STW情况下或是说少做STW情况下释放内存,目前为止,这个问题被循环引用问题死死的按住很多年都没有实质进展了,如果你能解决这个问题,那么相当于对所有有GC特性的语言进行了一次“工业革命”,将大大提升此类语言的执行效率,增加更多使用场景。

循环引用就是A中有B,B中有A,那么前面的两种GC机制都会被跳过,因为两个对象一直都是存活状态。这里就需要让所有业务线程STW,停止工作并挂起,由GC线程检测对象存活标记的真实性。

其中每个业务线程检测是否要STW的地方就称作安全点(SafePoint),业务线程中会在必经路径上被添加很多STW检测点,当业务线程进入SafePoint后,当前线程会被挂起直到GC线程发送STW结束信号。因此,此类GC是非常消耗性能的,所以它一定是定时触发或者条件触发,不能频繁执行。此处用到的GC算法也比较复杂,如根部节点是否可达这个级别。

所以从理论上来说,写业务代码的人了解这点原理,频繁的在多线程下碰触循环引用问题,1秒钟创建几十万个,那么所有带GC算法的语言都是低效的,内存占用巨大的。像GO和Java都是由以上几种方式组合形成了自己的GC方式,大同小异,GC上谁也不会胜出谁一头。仓颉语言官方文档却把这点作为卓越性能的宣传点,从文档中完全看不出特点在哪里。最多也只能说是一个常规做法。并不是“工业革命”级别的改变。

写在最后

目前来看,仓颉语言对于自己GC的描述翻译成白话文就是:“我生产的自行车速度非常快,当你用两支脚并行的蹬脚踏板的时候,自行车的两个轮子会并行在地面上旋转,带动你的身体飞速向前。”

或许仓颉语言在GC上是有自己的创新的,只是文档没写出来,我还是会持续关注。只是还是希望国产的东西实事求是一点,并不一定要给自己找一个什么比别人好的特点。其实就国产这一点已经是自己的特点了。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O1m9NpzKoJzH1Dfo-bAOrw7w0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券