c网站源码-JVM源码分析中YGC的来龙去脉

YGC是目前JVMGC中最频繁的GC类型。 高并发的服务在运行过程中会执行大量的YGC。 当YGC发生时,将执行STW。 通常时间都很短,除非遇到YGC时有大量幸存者。 需要复制对象

一个YGC过程主要分为两步:

1、找到GCRoots,将引用对象复制到to区;

2. 递归遍历步骤1中的对象,将引用到的对象复制到to区域。 事实上,可能存在自然晋升,或者由于to区空间不足而提前晋升

下面分析的是SerialGC。 ParNewGC可以理解为并发SerialGC。 实现原理类似。 如果看源码,建议看SerialGC的实现类DefNewGeneration。 虽然单线程实现的复杂度会低一些,但是在 DefNewGeneration 中,你会听到一些以 *-Closure 方法命名的类,它是一个封装的反弹函数,用于将 GC 的具体逻辑与对象内部的数组遍历逻辑松散耦合起来。 例如,将ScanClosure和FastScanClosure作为反弹函数传入各个方法中,其中实现了GC实现的对象遍历。 因为有了这些实现方法,大大降低了阅读源码的难度。

查找GCRoots

YGC的第一步是根据GCRoots找到第一批活跃对象,这是通过Hotspot中的gch->gen_process_strong_roots来实现的

红框的实现中,SharedHeap::process_strong_roots()扫描了所有必须是GCRoots的显存区域。 如果有兴趣可以查看process_strong_roots的实现,主要包括以下几个东西:

YGC执行时只收集young Generation,不收集old Generation和perm Generation,也不进行类卸载,所以以上可选部分均视为Strongroot,在FGC时不会视为Strongroot。

绿框中的实现逻辑对于YGC来说是没有意义的,因为level=0,Hotspot中唯一使用这个地方的是CMSGC实现。 默认情况下,只收集老年代,因此需要将年轻代作为其 Strongroot 进行扫描。

这里提到了,虽然有一部分被忽略了,但是如果一个old Generation对象引用了young Generation,那么这个old Generation对象也一定属于Strongroot的一部分。 这部分逻辑并不是在process_strong_roots中实现的,而是在红框中实现的,其中rem_set保存了old Generation中dirtycard对应的区域,联通每次都会检查是否形成新的跨代引用对象被复制,例如,如果一个对象晋升为old Generation,并且该对象还引用了young Generation的对象,在这些情况下,对应的卡将被设置为dirty。 在最后一次YGC中,只会扫描脏卡所指向的显存中的对象,以防止所有老年代对象都被扫描到。

迭代活动对象

在搜索GCRoots的过程中,已经找到了第一批幸存的对象。 这个幸存的对象可能在to-space中,也可能直接晋升到老年代。 需要遍历这种区域,以确保所有活动对象都能存活。

遍历过程的实现是通过FastEvacuateFollowersClosure类的do_void方法完成的,该类是另一个以*-Closure方法命名的类,实现如下

每个显存区域有两个指针变量,分别是_saved_mark_word和_top,其中_saved_mark_word指向当前遍历对象的位置,_top指向当前显存区域中可以分配的位置,以及_saved_mark_word和_top之间的对象是已复制但未扫描的对象。

GCRoots引用的对象被复制后,to-space的_saved_mark_word和_top的状态如上图所示,假设期间没有对象晋升到old Generation。 每次扫描到一个对象,_saved_mark_word 都会向前连接,期间新的对象会被复制到 to-space,并且 _top 也会向前连接,直到 _saved_mark_word 追上 _top,说明 to-space 中的对象已经被复制了。穿越过。

其中,while循环条件while(!_gch->no_allocs_since_save_marks(_level)是判断每一代内存中的_saved_mark_word是否已经追上_top,如果没有追上,则执行_gch->oop_since_save_marks_iterate进行遍历,如下如下:

从代码实现可以看出,会遍历新生代、老年代和永久代,新生代的遍历实现如下:

这里将分别遍历eden、from和to。 当我第一次看到这个逻辑时,我很郁闷。 为什么我们要穿越伊甸园和太空? from 没有问题。 _saved_mark_word 和 _top 通常是相同的,而 eden 区的 _saved_mark_word 显然不等于 _top,在 eden 区分配对象时c网站源码,仍然没有找到在改变 _top 的同时改变 _saved_mark_word 的逻辑。 在collect之前,会调用save_marks()方法,并将_saved_mark_word设置为_top,这样当YGC发生时,就不会遍历eden区的对象了。 我被这个问题困惑了很长时间,结果是遗留代码。

to-space对象的遍历实现:

这里的blk变量就是传入的FastScanClosure反弹函数。 oop_iterate方法会遍历该对象的所有引用,并调用反弹函数的do_oop_work方法来处理该引用所指向的对象。

do_oop_work的实现

在FastScanClosure反弹函数的do_oop_work方法的实现中,红框是一个重要的部分。 由于可能有多个对象引用一个对象,因此在遍历过程中,可能会遇到已经处理过的对象。 如果遇到这样的对象,则不会再次复制它。 如果对象尚未被复制,则调用copy_to_survivor_space方法将对象复制到to-space或提升到old Generation。 这是 ParNew 的实现。 由于是并发执行的c网站源码,所以可能有多个线程将同一个对象复制到to-space,但是通过原子操作,只能保证一个对象有效。

copy_to_survivor_space的实现:

复制对象的目标空间不一定是to-space,也可能是old Generation。 如果一个对象经历了多次YGC,就会直接从young Generation晋升到old Generation。 有一个位置记录了对象的YGC次数,也称为对象的年龄。 如果扫描到的对象的年龄大于某个阈值(tenuringthreshold),则该对象将被复制到to-space,并减少该对象的年龄。 同时,to-space的_top指针也会向前移动,这个新对象正在等待被扫描。

明天c网站源码,小编正好遇到了技术部的两位程序员。 听两兄弟的聊天,先是“JQuick锐尔”(JQuery),然后是“Encore T5X”(ActiveX)。 听小编一头雾水c网站源码,小编深入技术部门,仔细观察直播源代码是如何被敲下来的,以及程序员之前使用过哪些术语。 接下来我就给大家讲解一下直播源码需要了解的知识。

1. 基础语言

C:C 编程语言(The CProgramming Language)简洁而强大。

C++:C++语言(The C++Programming Language)是在C语言基础上发展起来的面向对象的程序设计语言。

c网站源码-JVM源码分析中YGC的来龙去脉

Objective-C:是一种扩展了C的面向对象编程语言,只能用于ios和MacOSX的编译。

Java:又名爪(zhao),可以编译网页应用、嵌入式系统等,有了它就可以将直播功能嵌入到现有的APP中。

Qt:一个跨平台编译器,支持Android、WindowsPhone和IOS。

(不仅是这种,还有C#/Swift/Perl/Shell/Scala等,敲活源码不容易啊!)

c网站源码-JVM源码分析中YGC的来龙去脉

2、前端开发(网站的表现层和结构层)

HTML:(HyperTextMarkupLanguage)超文本标记语言,虽然它是一种网页文件格式。

HTML5:是HTML的升级版本,H5是它的缩写,相对更加灵活。

CSS:层叠样式表(CascadingStyleSheets),用来改变网页的布局、颜色、字体等效果。

c网站源码-JVM源码分析中YGC的来龙去脉

CSS3:CSS技术的升级版,也是网页制作中使用的层叠样式表技术。

JQuery:一个轻量级的 JavaScript 库,兼容多种浏览器。

(JS/Ajax/DOM/Flash/UI也缺一不可,所以很难免费下载直播源代码。)

3.后端开发(数据库设计和管理等)

c网站源码-JVM源码分析中YGC的来龙去脉

API:应用程序编程接口(ApplicationProgrammingInterface)

CGI:通用网关接口(CommonGatewayInterface)

GUI:图形用户界面(GraphicalUserInterface)

PHP:超文本预处理器(PHP:Hypertext Preprocessor)是一种通用的开源脚本语言。

(直播系统的前端开发人员还必须会写Java代码、SQL语言等,直播的源码一点点敲下来。)

4.其他

SDK:软件开发工具包(softwaredevelopmentkit)包括与软件开发相关的文档、示例和工具的集合。

CDN:内容分发网络(Content Delivery Network)促进更快、更可靠的内容分发。

不仅仅是里面写的那些,还有一些其他的术语,但是通过上面我们已经可以看出,程序员写出直播源代码并不容易,所以这里给每一个程序员点赞。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 网站源码 c网站源码-JVM源码分析中YGC的来龙去脉 https://www.wkzy.net/game/127144.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务