JVM-CMS全过程分析_jvm cms流程_IMHB的博客-程序员资料

技术标签: JVM  

其实网上有很多这类的文章,但是主要最近闲来无事,就写一下自己在经过了各类书籍的研究后得出的一些自己的见解。

那么CMS的大部分流程其实都有说到,那么我们就从每个细节开始讲解一下吧。

1.初始标记
2.并发标记
3.重新标记
4.并发清除

一.首先是第一步:初始标记,该过程会导致STW,这个过程是为了扫描JVM当中的根对象(GC roots)以及直接关联的对象,所谓的根对象一般来说的话通常是指(1)栈中所使用到的对象。(2)本地方法所使用到的对象。(例如native)。(3)Class对象。(4)静态+final变量。(5)synchronized锁定的对象。等等(可以参考的文章)https://blog.csdn.net/xhh198781/article/details/42213847

那么这个时候扫描的时候就有两种方式,(1)广度优先(2)深度优先。那么CMS选择的是深度优先,这样的好处比较明显,因为计算机有一个预读机制,那么这个时候深度优先就会比广度优先更有效率。那么找到之后需要如何标记喃?

这个时候就会出现一种标记方法,三色标记法(黑白灰)。刚开始扫描一个对象的时候会先把它标记为灰色,然后去遍历其引用

(1)没有子节点引用了,那么会把他变为黑色。

(2)遍历其引用,首先将他变为黑色,然后将子节点引用变为灰色,接着遍历引用。(当然,该步骤不会只会去找GC Root对象,而不会去寻找其他对象)

那么JVM是如何处理颜色喃?

(1)黑:遍历完毕,不是垃圾

(2)灰:正在遍历

(3)白:垃圾,未扫描到的。

那么初始标记只会有两种颜色,黑色和灰色。那么这个时候第一步就走完了。

二.并发标记。

就是并发标记第一步标记的对象,把目前存活的对象标记上黑色。

由于叫做并发标记,那么何谓并发?

就是指GC线程和用户线程一起运行。那么中间就有可能出现对象关系发生改变的情况了。那么我们举个例子

下图最开始的关系是 A -> B -> C(A拥有B的引用,B拥有C的引用)。

那么在第二步刚好扫描到B的时候,用户线程将关系变成了A ->C ,B变成无引用。

那么这个时候C就可能在系统中找不到了,因为A已经是黑色了,不会再根据A去搜索了。

所以这个时候CMS提供了一种write barrier

write barrier是指记录当时引用的变化情况。

当整个环境中不存在灰色的时候就是重新标记的时候了。

三.重新标记

所谓的重新标记是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。那么是如何修正的喃?CMS是利用写屏障来保证,所谓的写屏障可以理解为在有对象关系变更的时候(除去删除)会加一层AOP处理,会将对象变化记录下来,但是新的线程产生的是没法记录下来的,那么就需要STW,然后通过日志进行对象关系变更,再次标记。

四.并发清除

并发清除是GC线程和用户线程一起执行的,那么这个时候新生成的对象是不会在这次GC范围之中的,那么就会有浮动垃圾。

那么只会处理在这次GC中被标记(为白色)的了。并且一旦经过了重新标记之后,仍然是白色的对象就不会被引用了。

如果只是标记清除即可,如果发生整理,和将年轻代移动到老年代的时候,就需要涉及到修改指针的问题了,

(1)直接引用:

那么流程大概是将所有引用到该对象的对象的地址变更。

(2)句柄:

那么直接将句柄中的值改掉即可,那么所有引用都会改变了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40384690/article/details/104610929

智能推荐

Cocos2d-X网络编程(3) Cocos2d中的网络通信协议——WebSocket协议_cocos websocket封装_穆玄的博客-程序员资料

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信。实现浏览器与服务器的即时通讯。即服务器也能主动向客户端发消息。 WebSocket代理类和方法:cocos2d同样对websocket进行了封装。WebSocket和WebSocket::Delegate1:WebSocket:   WebSocket类提供了跟websocket相关操...

8.6种灵活的寻址方式与其作用_寻址方式的作用_snowfox373的博客-程序员资料

(1) 立即寻址示例:Mov eax,56H作用:通常用于赋值。(2) 直接寻址示例:Mov eax,[12558878H]作用:通常用于处理变量。(3) 寄存器寻址示例Mov eax,[edi]作用:地址在寄存器中。(4)寄存器相对寻址示例Mov EAX,[EDI+32H]作用:常用于访问数组和结构。

CSS清除浮动_清除元素浮动对four的影响_hnyysly的博客-程序员资料

在文章开始前,建议看一下这篇文章:All About Floats, 其讲解了相当多关于CSS浮动的内容,包括浮动产生的问题以及怎样清除浮动.CSS清除浮动的方式我认为清除浮动应该分为两部分:包含块外清除浮动与包含块内清除浮动. 包含块外当然就是指的 clear: both; 清除的浮动, 是用来避免块元素间的对齐问题; 而我们目前大家所说的CSS清除浮动一般都是指的包含块内清除浮动,这也

测试基础知识题_seak海的博客-程序员资料

软件的生命周期(prdctrm)计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne)测试用例用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤  预期结果1、问:你在测试中发现了一个bu...

关于调试bug的感想_probonbug_Rachel-Zhang3的博客-程序员资料

1.今天boss(eric)帮我调试了一下程序中的bug,查找得很有条理(其中有些功能我还不是很会使用,譬如全局搜索功能,我以前只知道有,但是关键时刻不知道使用,这次长见识了),为什么我就不敢那么做呢?我总是视官方的代码如同雷区,寸步不敢删不敢改,导致我一直陷入苦恼。2.对程序上的认识还是比较欠缺,以前没遇到过的代码问题只知道从google上搜索解决办法,殊不知先从代码开始入手查找错误。3.

微软漏洞被用于金融欺诈、VMware发布漏洞补丁|2月16日全球网络安全热点_mylobot_腾讯安全的博客-程序员资料

安全资讯报告全球检测到超过270万例Emotet恶意软件案例据一家美国信息安全公司称,自去年年底以来,全球已发现超过270万起涉及Emotet恶意软件的案件,该恶意软件被认为是世界上最危险的恶意软件,尽管其服务器早些时候在国际执法行动中被拆除。Emotet通过电子邮件附件发送后感染计算机,近几个月来迅速传播,11月确诊病例90,000例,1月确诊病例107万例。Proofpoint Inc.表示,2月初发现了超过125万例病例。在日本,包括家居用品制造商Lion Co...

随便推点

C语言程序设计1_键律疯魔的博客-程序员资料

C语言程序设计1计算机语言分类:机器语言:(machine language)计算机直接使用的二进制形式的程序语言或机器代码。汇编语言:借助助记符进行描述的计算机语言。高级语言:(high-level language)是易为人们所理解的完全符号化的程序设计语言。 例如:C、C++、Java语言写代码的过程:编辑器: 程序员写代码的过程(记事本、vc6.0、vim)编译器:查看代码的语法错误,生成汇编语言。汇编器:将生成好的汇编语言生成二进制语言(目标文件)

vscode开发常用插件一览表_vscode 函数关系图 插件_CHH5431的博客-程序员资料

vscode开发常用插件一览表小程序开发助手Add jsdoc comments 函数参数注释插件any-rule 常用正则表达式Auto Close Tag 自动闭合标签Auto Rename Tag 自动重命名标签Beautify 整理代码格式Chinese (Simplified) Language Pack for Visual Studio Code 中文语言插件CSS Peek 通过class名称自动定位到css样式文件的位置Dracula Official 吸血鬼主题Hi

UUID原理_ScrappyShiyu的博客-程序员资料

    在分布式、网络、单机环境下,为了能够使用具有某种形式的ID唯一标识系统中的任一元素,这样的ID可以不依赖中心认证自动生成,于是UUID就诞生了。    UUID标准的历史沿革和具体实现在RFC 4122、ITU-T Rec. X.667和ISO/IEC 9834-8:2008中均有详细描述。ITU和ISO采用的标准和RFC 4122都是在UUID的早期版本基础上完成,各版本之间具有一致性和...

Tomcat设置访问时隐藏端口号项目名_tomcat隐藏端口_Dyman_的博客-程序员资料

隐藏端口号打开tomcat/conf/server.xml,将端口号改成80 隐藏项目名打开tomcat/conf/server.xml,在Host标签里添加Context,如图操作,docBase填写项目全路径

黑马程序员——java基础之正则表达式_binbinsex的博客-程序员资料

特点正则表达式:符合一定规则的表达式。 作用:用于专门操作字符串。 特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。 所以学习正则表达式,就是在学习一些特殊符号的使用。 好处:可以简化对字符串的复杂操作。 弊端:符号定义越多,正则越长,阅读性越差。

推荐文章

热门文章

相关标签