cms算法
‘壹’ 请问php中的CMS是什么意思
CMS(Content Management System),中文叫作整站系统、文章系统,大概2004以前,如果想进行网站内容管理,基本上都是靠手工维护,但千变万化的信息流,但没有好的程序支持,还继续靠手工完成是不可能的事,如果有一个好的系统来支撑你的网站,那将节省大量的人力物力,开发者就可能给客户一个软件包,可以用它定期人工修改网站。只要你配置安装好,你的编辑,在线记者,更新员只要定期更新数据,剩下的事就交给CMS去处理。
=== Asp ===
动易CMS管理系统,官方网站:http://www.asp163.net/
这套是国产AspCMS中非常强大的系统,从3.0的简单的一个文章系统到现在的2005的版本,一路走来,动易不断完善,而且也不断加强功能,包括个人版,学校版,政府版,企业版,后台包括的功能,信息发布,类别管理,权限控制,信息采集,而且跟第三方的程序,比如论坛,商城(2005的已经自带了), blog可以完美结合,基本上可以满足一个中大型网站的要求,但Asp和Access的的局限性,还有本身功能Dll的限制,使得免费版差不多成鸡肋,
风讯 官方网站:http://www.foosun.cn/
风讯的系统功能强大,自由度高,是现在人气比较高的系统之一,可以根据自己的想法做出一个网页从而建立一个有自我风格的网站,更新速度快,一直有新的版本出现,现在又开放采集、下载、投稿、图片整站管理系统,第三方整合等功能,开源是它最大特点,希望保持。然后缺点就是后台人性化差了一点,上手有点难度,而且连一套默认的模板都没有,因为自由度太高了,让一些新手更难上手,还有就是免费版的生成静态发布的效率不高。3.1已经出来一段时间了,愿各方面都更上一层楼。
新云网站管理系统 官方http://www.newasp.cn/
一款Asp的CMS后起之秀,发现有不少的网站都在使用。由文章、下载、商城、留言、用户管理五大功能模块和广告、公告、连接、统计、采集、模板管理、数据库管理等多个通用模块组成,而且功能确实有一些值得称道的地方,不过又是DLL的,免费版有不少的限制,但对一个简单基本的网站来说,功能够用了。
乔客(asp) 官方网站:http://www.joekoe.com/
这个系统已经很久了,但好像一直存活在动易和风讯两者之间,现在3.0的Joekoe CMS出来了,但另我比较失望,相比免费版的1.2,功能是增强了,但也Dll,这个可能也是国产程序的一个特色罢了。它本身已经是一个融合度非常高的系统,有商城,新闻,下载,论坛,留言,影视,博客圈等,感觉有那么点WEB2.0 的味道,,不想怎么修改的朋友直接拿去就可以用了。
NB文章系统(asp) 官方:http://forum.nbarticle.com/default.asp
现在最新的是v2.1 RC1 ,上手挺容易,后台很简洁,安全性能不错,发布效率比较高,当然想到同类型的,RSS不错,它也是将模板写入数据库,但修改还是蛮方便。不过这样相对来说功能是少了一些,而且官方就一个论坛技术支持,论坛的人气差了一点。
渐飞新闻出版系统(asp) 官方网站: http://www.xunt.net/
这个系统也有一段时日了,不过到现在还是1.1的版本,以前名头特别响,
不过主要针对的是商业客户,看客户演示,个个都像门户,但因为没免费版的支撑,市场也一直没做大。
大世纪(Asp) 官方网站:http://www.bigcn.net/
很老的系统,差不多就算是个文章,新闻系统,
现在连官方都打不开了,这样的估计也没多少前景。
tsys信息发布系统 官方:http://www.tsyschina.com
非常遗憾 2.0刚刚出测试版,作者就好像人间蒸发一样消失了!不过对于一个免费开源,没有版权的CMS来说我们也没有什么可要求的!抛开强大,但可能不成熟(我没用过)的2.0不谈!单说1.1版!从 1.1就可以说他是ASP CMS中的老大了!在TSYS的各个版本中均没有出现过重大的安全漏洞而且对于目前1.1来说已经是很完善成熟的了!tsys和一般的Asp 的CMS不一样!他的功能并非由本身而定!而是根据使用者的能力而定!使用者越厉害 TSYS本身也可以变的更厉害!因为TSYS可以说是一个核心!而其他的东西和功能均需要使用者自己搞定!从这点来说!TSYS的功能可以说是无限的!但这也决定了TSYS不会流行起来!说白了只有高手使用TSYS才能把TSYS的优点发挥的淋漓尽致!可惜啊....
说到php的CMS,也跟Asp差不多,可以算是百花齐放。
PhpArtile 官方:http://www.21ds.net/
这个算是国内phpCms的祖宗了,PA由 PHP 语言开发, 使用 MySQL 数据库保存数据 ,
为中小型网站发表文章, 存放资料, 新闻发布提供一个完美的解决方案。
做了好几年了,3.0迟迟还在开发中,今年出了2.1火了一阵,又熄灭了,以前用的人挺多的,
现在基本上没落了
phpcms 官方:http://www.phpcms.cn/
好像以前是9466Article的官方,本来9466做得挺好的,不知为什么突然zend加密了,
继承了9466的优点,上手,结构,提供插件接口,可自主开发插件,自主制作语言包,
自主设计模板风格,免费版可永久使用,功能还可以。
OKphp http://cn.okphp.com
同样加密的,免费版也不见怎么有人用,系统倒是开发了好久了,整合了论坛,blog,新闻,
分有企业版,门户版,还有免费的,看起来像老外的Nuke,个人感觉没多少特别之处。
美丽心雨 官方:http://www.xydw.com/
美丽心雨CMS是心雨动网独立开发制作的网站管理系统,基本上网站管理的功能有了,
从1.01到现在的1.4,官方的开发人员也一直在努力中。
DedeCMS 官方:http://dedecms.com/
这是一套令人爱憎分明的系统,首先它是国内一款开源的系统,2.x的时候功能都已经另它的fans为之疯狂,
非常灵活的定制,强大的功能,简洁的操作,但2.x的瓶颈问题:大数据处理,到3.0的时候可能会解决,
但3.0的一直跳票,迟迟不见发布,另很多人都非常失望,希望能在3.0的时候看到一个全新的Dedecms,
当然也支持开源产品。
Ss-cms 官方:http://www.ss-cms.com/
作者我见过,一个非常有活力的家伙,程序跟他一样,国产的开源系统,
生成静态,信息采集,文章和下载集成,
但作者都是出于兴趣爱好开发,1.0出来后就不见踪影了,好像现在在搞书库
随意Cmsez CMS 官方:http://www.cmsez.com/
程序的作者和Ss-cms的作者是好朋友,他也是出于个人爱好做这个,而且主要面向企业用户,
Cmsez集成了丰富的功能模块,http://www.colorbird.com/(七色?...??型客户,
看七色鸟,你或许可以知道他的作品如何了。
CMSware 官方:http://www.cmsware.com/
一个非常不错的CMS系统,比较看好的他的后台操作简介,一些新技术,比如Ajax的应用,Wap的功能,
还有它的PSN的发布,节点和模块的定制,,自定义模型,数据库字段,
率先引进的工作流的概念,更多的发布自由度,非常强大的模板体系,
确实处处体现了自由的思想,让您体验自由管理的非凡感受.
Ecms 帝国网站管理系统 官方:http://www.phome.net/
可以说这个是最让我值得写的东西,作者wm_chief是个超人,偶像啊
官方的title里面是 在这里只有原创,那家伙也是疯子,
比如数据库管理,论坛,新闻,下载,flash,域名交易系统等,
还包括JSP的版本,都是自己一个人写,还有一个人搞定后期服务,客户支持,产品宣传。
还要每天抽时间灌水AD,ECMS的功能非常多,包括下载,flash,商城,图片,新闻,友情链接,广告管理等,
比如一些远程发布,刷新效率,类别管理,权限细分,万能的论坛接口,信息采集,附件管理等这些都是Ecms特别的亮点,
而且免费版也不错,作者WC也非常虚心接受客户的建议,
基本上任何一个小的功能,都力求做到最好,
他明白用户的需求,一切能从用户本身出发的系统才是好的系统,
3.6已经出来了,而且下一个版本可能会结合EXE软件发布,刷新的功能,让我们拭目以待。
ecms的典型客户 www.chinahtml.com
.Net
动网新闻(asp.net)
最新的4.X也出来了,也是DLL的,不过系统是.NET的,不过我个人不趋向使用DLL的系统,
运行速度快,效率高,安全做足。
不过以前3.X的没有Dll,感觉也蛮好的,
缺点就是风格改起来不容易。
现在加密了,反而能更快上手,不过这样可以定制的地方就少了。
还有一个倒奶CMS,也是.net的,不见什么特别之处,一笔带过
JSP
大概有这些:
Netark CMS
方正翔宇CMS
开源的Magnolia
Magnolia CMS
不过JSP的应用门槛对我们个人用户来说,有点高,也不想多提
当然还有一些系统比如说,Asp的国产FeitecCMS ,WpsCms等,国外的FullXML,php的国产有MePhp,天下站长php等,
都没见多少特色,不用也罢。
TurboCMS 这样只面向企业用户,几十万的系统,我们也不用考虑。
Struts中文版,Spring 开源系统,Gpower CMS,还有java的 Ion,opencms,Jboss Nuke等老外做的,
国外的php的比如phpnuke,phppost,还有非常昂贵的phpcow,Bitrix Site Manager-CMS(99),
比较廉价的Subdreamer,koobi CMS,ActiveKB团队的ArticleLive NX,newsphp
还有免费的Xoops,功能繁多的玩意,Mambo这样的开源系统,还有Mambo的变种LimboCMS,Mamhoo 。
不符合国情的,在国内也没见流行
还有国外CMS的大全:http://bbs.chinahtml.com/t602.html 自己有空去翻翻
如果要比较老外CMS的也可以进去看看:http://bbs.chinahtml.com/t5429.html 直接选择2-10项,,有详细的列表说。
现在每个CMS功能介绍上都会说自己的产品如何强大,比如说什么模板体系如何好,
缓存技术如何高明,刷新效率,负载容量如何强,操作如何如何简单,容易上手,跟第三方无缝结合,还有功能模块的如何丰富,生成静态发布,信息采集……
吹牛谁都会,大家都会写,关键是客户如何认为,反正一句话,适合自己的就是最好的。
很长时间以来,我一直在寻找一个优秀的CMS(Content Management System 内容管理系统)作为自己网站的核心系统。为此我专门研究过postnuke、Xoops等一些基于LAMP架构的CMS,还研究过基于Java的OpenCMS和基于J2EE架构的JBoss的Nukes。OpenCMS是一个非常不错的系统,只可惜架构与自己的方向不符,而且需要大量的二次开发工作,只好放弃。这些CMS系统或多或少都有让自己很不满意的地方,我也并不想耗费太多的精力自己来开发一套,网站的计划甚至一度搁置了下来,直到我看到了eZ publish。
找到eZ publish还是偶然看到www.php.net上左侧的eZ Systems的链接,ez的网址是www.ez.no,一个挪威的公司开发的系统,试用后我得出了结论,它就是我一直在寻找的东西。
在CMS选型的过程中我经常的问自己,什么才是好的CMS?
现在要我回答这个问题的话,我会说适合自己需要的就是好的系统。因为这期间经历了太多的考虑或者说犹豫,有时候甚至是痛苦的。
首先是语言的选择,是基于Java的还是PHP的呢?因为我本人以前是从事Java的开发工作,钟情于Java优美的语言风格和架构,所以一度考虑采用OpenCMS,而且OpenCMS号称可以承受很大强度的访问量,这听起来似乎很诱人。然而我在研究它的过程中发现OpenCMS复杂且庞大,文档过时,需要花费大量的精力进行二次开发,作为业余时间搞网站的我们来说的确没有这个精力,于是只好放弃。现在要我回头看这个问题,我认为我的选择是正确的,选择CMS要考虑到自身的二次开发和日后维护的能力与精力耗费以及网站的业务需要,选择开发维护快速方便和自己也比较熟悉的的LAMP架构已经能适应我网站的需要。
其次,在基于LAMP架构的CMS系统中进行横向比较时,优劣比较明显。postnuke与Xoops这类CMS应该说十分的简单易用,基本上不需要做什么二次开发,基础功能就可以满足一般的需要。
而eZ publish相比起来要专业和庞大的多,它有自己专有的核心库和模版语言,面向对象的思想在eZ里体现的十分明显,甚至在它的配置文件中都有体现,内容与形式的分离做得相当好,扩展方便。而且它本身自带有article、gallery、webshop和forum等这些我所需要的功能,不需要再二次开发,十分的方便。而且在www.ez.no上有关于eZ publish的详细开发和使用文档可供参考。
eZ publish是eZ System公司发布的,专业的公司保证了系统以后的升级与维护的持续性,这一切都是我选择eZ的理由。
在整个CMS选型直到确定下eZ publish后,我发现这个过程持续时间是漫长而又痛苦的。经历了许多的波折,但也的确是值得的,毕竟CMS是整个网站的核心,很庆幸有eZ publish的存在而且我也发现了它。
一个好消息,eZ publish3.5近两天就会推出最终版了,而我的两个网站www.cnwebservices.com与www.o2.cn也将陆续推出。首先在12月初推出的将是关于LAMP与网站建设的技术性网站www.cnwebservices.com,是基于eZ publish CMS的网站,届时会有更多关于LAMP与开源项目的技术文章,敬请大家留意。
随着BLOG程序的普及,越来越多的普通用户开始了解或者接触到CMS(网站内容管理系统)这一概念。BLOG做为一种相对简单的内容管理系统,实 际上向更多的普通网民普及了网站后面的基本动态技术。我相信将来会有越来越多的人会不满足于只用BLOG来书写和表达,会有更多的人将会应用到较为复杂的 多人参与型CMS系统,这会与网络发展的去中心化趋势有关,一个中小型的,以一个或者几个人创造为主,大量读者松散参与的网站,会比中心化垄断型的网站更 具有活力。同时,它也使创造者的利益得到更加合理的体现。现在一个好的,内容专一又专业的小网站,很容易会得到足够的流量,仅仅通过GOOGLE类似的广 告就可以维持。
这个过程中一个决定性的因素就是网站构建技术和网站本身的服务内容之间的分离。几年前,在BLOGGER之 前,要想在网络上顺利的发表,还真的需要知道一点技术,而现在,大多数天天书写着BLOG的人,都是没有任何技术背景的普通用户。随着开源CMS项目如火 如茶的发展趋势,加上未来主机托管或者虚拟主机租用费用的不断降低,一个不具备专业网络技术知识的人,都可以轻易的建立自己的网站,如果说这几年BLOG 的发展解放了普通民众的发言权,这种功能更为复杂的CMS系统的发展,将会促使那些更加会创造,会关心别的用户的需求的人的创造得到利益上的回报。知识有 价,但会是更合理的方式。
甚至,可以预言,这可能会是一轮新的去中心化的开始,即中小型网站对大型内容门户的蚕食的开始。内容是互联网的生命,内容管理系统将那些深藏在用户 内心深处的想法流畅的表达出来,从而使整个网络充满活力。其实你稍稍想一想就可以发现,这本身并不是什么“蚕食”,因为这些内容门户才是内容事实上的掠夺 者,越来越多的报纸对新浪等的“海量”转载产生不满只是这个事实的冰山一角。
将来转载型的网站的重要性一定会不断降低,除非它在这个过程中创造了新的对用户有利的价值,随着GOOGLE算法的改进,将来出现在搜索结果首页的东西一定是那些用户最想需要的东西,而且是一定是那些创造者的网页。
所以现在很关注CMS系统的情况,正好,OPENSOURCE CMS进行了一个最佳网站内容管理系统的投票评选,不如就从这里入手去探寻CMS系统的情况。
现在排在前5名,也就是最终入围项目的名单是:
Drupal
e107
Joomla!
Plone
Xoops
接下来就准备把这几个东西一一试用一下。显然这些最受欢迎的东西并不一定能够代表最有创造性的想法,一定有更多的想法隐藏在那些不为人关注的项目中,不过,这应该是能够代表潮流的东西。
‘贰’ 三色标记法与垃圾回收器(CMS、G1)
JVM中的CMS、G1垃圾回收器所使用垃圾回收算法即为三色标记法。
三色标记法将对象的颜色分为了黑、灰、白,三种颜色。
存在问题:
浮动垃圾:并发标记的过程中,若一个已经被标记成黑色或者灰色的对象,突然变成了垃圾,此时,此对象不是白色的不会被清除,重新标记也不能从GC Root中去找到,所以成为了浮动垃圾,这种情况对系统的影响不大,留给下一次GC进行处理即可。
对象漏标问题(需要的对象被回收):并发标记的过程中,一个业务线程将一个未被扫描过的白色对象断开引用成为垃圾(删除引用),同时黑色对象引用了该对象(增加引用)(这两部可以不分先后顺序);因为黑色对象的含义为其属性都已经被标记过了,重新标记也不会从黑色对象中去找,导致该对象被程序所需要,却又要被GC回收,此问题会导致系统出现问题,而CMS与G1,两种回收器在使用三色标记法时,都采取了一些措施来应对这些问题,CMS对增加引用环节进行处理(Increment Update),G1则对删除引用环节进行处理(SATB)。
在JVM虚拟机中有两种常见垃圾回收器使用了该算法:
CMS(Concurrent Mark Sweep)
CMS,是非常有名的JVM垃圾回收器,它起到了承上启下的作用,开启了并发回收的篇章。
但是CMS由于许多小问题,现在基本已经被淘汰。
增量更新(Increment Update)
在应对漏标问题时,CMS使用了Increment Update方法来做:
在一个未被标记的对象(白色对象)被重新引用后,==引用它的对象==,若为黑色则要变成灰色,在下次二次标记时让GC线程继续标记它的属性对象。
但是就算时这样,其仍然是存在漏标的问题:
在一个灰色对象正在被一个GC线程回收时,当它已经被标记过的属性指向了一个白色对象(垃圾)
而这个对象的属性对象本身还未全部标记结束,则为灰色不变
而这个GC线程在标记完最后一个属性后,认为已经将所有的属性标记结束了,将这个灰色对象标记为黑色,被重新引用的白色对象,无法被标记
补充,CMS除了这个缺陷外,仍然存在两个个较为致命的缺陷:
解决方案:使用Mark-Sweep-Compact算法,减少垃圾碎片
当JVM认为内存不够了,再使用CMS进行并发清理内存可能会发生OOM的问题,而不得不进行Serial Old GC,Serial Old是单线程垃圾回收,效率低
解决方案:降低触发CMS GC的阈值,让浮动垃圾不那么容易占满老年代
G1(Garbage First)
从G1垃圾回收器开始,G1的物理内存不再分代,而是由一块一块的Region组成;逻辑分代仍然存在。
前置知识 — Card Table(多种垃圾回收器均具备)
由于在进行YoungGC时,我们在进行对一个对象是否被引用的过程,需要扫描整个Old区,所以JVM设计了CardTable,将Old区分为一个一个Card,一个Card有多个对象;如果一个Card中的对象有引用指向Young区,则将其标记为Dirty Card,下次需要进行YoungGC时,只需要去扫描Dirty Card即可。
Card Table 在底层数据结构以 Bit Map实现。
CSet(Collection Set)
SATB(Snapshot At The Beginning)
在应对漏标问题时,CMS使用了SATB方法来做:
因为SATB在重新标记环节只需要去重新扫描那些被推到堆栈中的引用,并配合Rset来判断当前对象是否被引用来进行回收;
并且在最后G1并不会选择回收所有垃圾对象,而是根据Region的垃圾多少来判断与预估回收价值(指回收的垃圾与回收的STW时间的一个预估值),将一个或者多个Region放到CSet中,最后将这些Region中的存活对象压缩并复制到新的Region中,清空原来的Region。
问题:G1会不会进行Full GC?
会,当内存满了的时候就会进行Full GC;且JDK10之前的Full GC,为单线程的,所以使用G1需要避免Full GC的产生。
解决方案:
加大内存;
提高CPU性能,加快GC回收速度,而对象增加速度赶不上回收速度,则Full GC可以避免;
降低进行Mixed GC触发的阈值,让Mixed GC提早发生(默认45%)
G1的第一篇paper(附录1)发表于2004年,在2012年才在jdk1.7u4中可用。oracle官方计划在jdk9中将G1变成默认的垃圾收集器,以替代CMS。为何oracle要极力推荐G1呢,G1有哪些优点?
首先,G1的设计原则就是简单可行的性能调优
开发人员仅仅需要声明以下参数即可:
其中-XX:+UseG1GC为开启G1垃圾收集器,-Xmx32g 设计堆内存的最大内存为32G,-XX:MaxGCPauseMillis=200设置GC的最大暂停时间为200ms。如果我们需要调优,在内存大小一定的情况下,我们只需要修改最大暂停时间即可。
其次,G1将新生代,老年代的物理空间划分取消了。
这样我们再也不用单独的空间对每个代进行设置了,不用担心每个代内存是否足够。
取而代之的是,G1算法将堆划分为若干个区域(Region),它仍然属于分代收集器。不过,这些区域的一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间。老年代也分成很多区域,G1收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。这就意味着,在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样也就不会有cms内存碎片问题的存在了。
在G1中,还有一种特殊的区域,叫Humongous区域。 如果一个对象占用的空间超过了分区容量50%以上,G1收集器就认为这是一个巨型对象。这些巨型对象,默认直接会被分配在年老代,但是如果它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象。如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC。
PS:在java 8中,持久代也移动到了普通的堆内存空间中,改为元空间。
对象分配策略
说起大对象的分配,我们不得不谈谈对象的分配策略。它分为3个阶段:
对TLAB空间中无法分配的对象,JVM会尝试在Eden空间中进行分配。如果Eden空间无法容纳该对象,就只能在老年代中进行分配空间。
最后,G1提供了两种GC模式,Young GC和Mixed GC,两种都是Stop The World(STW)的。下面我们将分别介绍一下这2种模式。
Young GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。在这种情况下,Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升到年老代空间。Survivor区的数据移动到新的Survivor区中,也有部分数据晋升到老年代空间中。最终Eden空间的数据为空,GC停止工作,应用线程继续执行。
这时,我们需要考虑一个问题,如果仅仅GC 新生代对象,我们如何找到所有的根对象呢? 老年代的所有对象都是根么?那这样扫描下来会耗费大量的时间。于是,G1引进了RSet的概念。它的全称是Remembered Set,作用是跟踪指向某个heap区内的对象引用。
在CMS中,也有RSet的概念,在老年代中有一块区域用来记录指向新生代的引用。这是一种point-out,在进行Young GC时,扫描根时,仅仅需要扫描这一块区域,而不需要扫描整个老年代。
但在G1中,并没有使用point-out,这是由于一个分区太小,分区数量太多,如果是用point-out的话,会造成大量的扫描浪费,有些根本不需要GC的分区引用也扫描了。于是G1中使用point-in来解决。point-in的意思是哪些分区引用了当前分区中的对象。这样,仅仅将这些对象当做根来扫描就避免了无效的扫描。由于新生代有多个,那么我们需要在新生代之间记录引用吗?这是不必要的,原因在于每次GC时,所有新生代都会被扫描,所以只需要记录老年代到新生代之间的引用即可。
需要注意的是,如果引用的对象很多,赋值器需要对每个引用做处理,赋值器开销会很大,为了解决赋值器开销这个问题,在G1 中又引入了另外一个概念,卡表(Card Table)。一个Card Table将一个分区在逻辑上划分为固定大小的连续区域,每个区域称之为卡。卡通常较小,介于128到512字节之间。Card Table通常为字节数组,由Card的索引(即数组下标)来标识每个分区的空间地址。默认情况下,每个卡都未被引用。当一个地址空间被引用时,这个地址空间对应的数组索引的值被标记为”0″,即标记为脏被引用,此外RSet也将这个数组下标记录下来。一般情况下,这个RSet其实是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。
Young GC 阶段:
Mix GC不仅进行正常的新生代垃圾收集,同时也回收部分后台扫描线程标记的老年代分区。
它的GC步骤分2步:
全局并发标记(global concurrent marking)
拷贝存活对象(evacuation)
在进行Mix GC之前,会先进行global concurrent marking(全局并发标记)。 global concurrent marking的执行过程是怎样的呢?
在G1 GC中,它主要是为Mixed GC提供标记服务的,并不是一次GC过程的一个必须环节。global concurrent marking的执行过程分为五个步骤:
初始标记(initial mark,STW)
在此阶段,G1 GC 对根进行标记。该阶段与常规的 (STW) 年轻代垃圾回收密切相关。
根区域扫描(root region scan)
G1 GC 在初始标记的存活区扫描对老年代的引用,并标记被引用的对象。该阶段与应用程序(非 STW)同时运行,并且只有完成该阶段后,才能开始下一次 STW 年轻代垃圾回收。
并发标记(Concurrent Marking)
G1 GC 在整个堆中查找可访问的(存活的)对象。该阶段与应用程序同时运行,可以被 STW 年轻代垃圾回收中断
最终标记(Remark,STW)
该阶段是 STW 回收,帮助完成标记周期。G1 GC 清空 SATB 缓冲区,跟踪未被访问的存活对象,并执行引用处理。
清除垃圾(Cleanup,STW)
在这个最后阶段,G1 GC 执行统计和 RSet 净化的 STW 操作。在统计期间,G1 GC 会识别完全空闲的区域和可供进行混合垃圾回收的区域。清理阶段在将空白区域重置并返回到空闲列表时为部分并发。
提到并发标记,我们不得不了解并发标记的三色标记算法。它是描述追踪式回收器的一种有用的方法,利用它可以推演回收器的正确性。 首先,我们将对象分成三种类型的。
根对象被置为黑色,子对象被置为灰色。
继续由灰色遍历,将已扫描了子对象的对象置为黑色。
遍历了所有可达的对象后,所有可达的对象都变成了黑色。不可达的对象即为白色,需要被清理。
这看起来很美好,但是如果在标记过程中,应用程序也在运行,那么对象的指针就有可能改变。这样的话,我们就会遇到一个问题:对象丢失问题
我们看下面一种情况,当垃圾收集器扫描到下面情况时:
这时候应用程序执行了以下操作:
这样,对象的状态图变成如下情形:
这时候垃圾收集器再标记扫描的时候就会下图成这样:
很显然,此时C是白色,被认为是垃圾需要清理掉,显然这是不合理的。那么我们如何保证应用程序在运行的时候,GC标记的对象不丢失呢?有如下2中可行的方式:
在插入的时候记录对象
在删除的时候记录对象
刚好这对应CMS和G1的2种不同实现方式:
在CMS采用的是增量更新(Incremental update),只要在写屏障(write barrier)里发现要有一个白对象的引用被赋值到一个黑对象 的字段里,那就把这个白对象变成灰色的。即插入的时候记录下来。
在G1中,使用的是STAB(snapshot-at-the-beginning)的方式,删除的时候记录所有的对象,它有3个步骤:
这样,G1到现在可以知道哪些老的分区可回收垃圾最多。 当全局并发标记完成后,在某个时刻,就开始了Mix GC。这些垃圾回收被称作“混合式”是因为他们不仅仅进行正常的新生代垃圾收集,同时也回收部分后台扫描线程标记的分区。混合式垃圾收集如下图:
混合式GC也是采用的复制的清理策略,当GC完成后,会重新释放空间。
至此,混合式GC告一段落了。下一小节我们讲进入调优实践。
MaxGCPauseMillis调优
前面介绍过使用GC的最基本的参数:
前面2个参数都好理解,后面这个MaxGCPauseMillis参数该怎么配置呢?这个参数从字面的意思上看,就是允许的GC最大的暂停时间。G1尽量确保每次GC暂停的时间都在设置的MaxGCPauseMillis范围内。 那G1是如何做到最大暂停时间的呢?这涉及到另一个概念,CSet(collection set)。它的意思是在一次垃圾收集器中被收集的区域集合。
Young GC:选定所有新生代里的region。通过控制新生代的region个数来控制young GC的开销。
Mixed GC:选定所有新生代里的region,外加根据global concurrent marking统计得出收集收益高的若干老年代region。在用户指定的开销目标范围内尽可能选择收益高的老年代region。
在理解了这些后,我们再设置最大暂停时间就好办了。 首先,我们能容忍的最大暂停时间是有一个限度的,我们需要在这个限度范围内设置。但是应该设置的值是多少呢?我们需要在吞吐量跟MaxGCPauseMillis之间做一个平衡。如果MaxGCPauseMillis设置的过小,那么GC就会频繁,吞吐量就会下降。如果MaxGCPauseMillis设置的过大,应用程序暂停时间就会变长。G1的默认暂停时间是200毫秒,我们可以从这里入手,调整合适的时间。
其他调优参数
避免使用以下参数:
避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小。固定年轻代的大小会覆盖暂停时间目标。
触发Full GC
在某些情况下,G1触发了Full GC,这时G1会退化使用Serial收集器来完成垃圾的清理工作,它仅仅使用单线程来完成GC工作,GC暂停时间将达到秒级别的。整个应用处于假死状态,不能处理任何请求,我们的程序当然不希望看到这些。那么发生Full GC的情况有哪些呢?
并发模式失败
G1启动标记周期,但在Mix GC之前,老年代就被填满,这时候G1会放弃标记周期。这种情形下,需要增加堆大小,或者调整周期(例如增加线程数-XX:ConcGCThreads等)。
晋升失败或者疏散失败
G1在进行GC的时候没有足够的内存供存活对象或晋升对象使用,由此触发了Full GC。可以在日志中看到(to-space exhausted)或者(to-space overflow)。解决这种问题的方式是:
巨型对象分配失败
当巨型对象找不到合适的空间进行分配时,就会启动Full GC,来释放空间。这种情况下,应该避免分配大量的巨型对象,增加内存或者增大-XX:G1HeapRegionSize,使巨型对象不再是巨型对象。
由于篇幅有限,G1还有很多调优实践,在此就不一一列出了,大家在平常的实践中可以慢慢探索。最后,期待java 9能正式发布,默认使用G1为垃圾收集器的java性能会不会又提高呢?
G1处理和传统的垃圾收集策略是不同的,关键的因素是它将所有的内存进行了子区域的划分。
总结
G1是一款非常优秀的垃圾收集器,不仅适合堆内存大的应用,同时也简化了调优的工作。通过主要的参数初始和最大堆空间、以及最大容忍的GC暂停目标,就能得到不错的性能;同时,我们也看到G1对内存空间的浪费较高,但通过**首先收集尽可能多的垃圾(Garbage First)的设计原则,可以及时发现过期对象,从而让内存占用处于合理的水平。
参考链接:
https://juejin.cn/post/6859931488352370702
https://blog.csdn.net/qq_39276448/article/details/104470796
‘叁’ JVM的垃圾算法有哪几种
一、垃圾收集器概述
如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。
JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用
二、各个垃圾收集器说明
1、Serial(年轻代)
年轻代收集器,可以和Serial Old、CMS组合使用
采用复制算法
使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止
client模式年轻代默认算法
GC日志关键字:DefNew(Default New Generation)
图示(Serial+Serial Old)
7、G1
G1收集器由于没有使用过,所以从网上找了一些教程供大家了解
并行与并发
分代收集
空间整合
可预测的停顿