荣耀6各个版本之间的区别

现在荣耀6只发型的是移动单卡版,后面哈有联通版,高配版,他们到底有什么区别的呢? 这里列出一个表格让你看得明白 型号 H60-L01 H60-L11 H60-L02 H60-L12 H60-L21 型号 移动4G 单卡版 (标配) 移动4G 单卡版 (高配) 联通4G 双卡版 (标配) 联通4G 双卡版 (高配) 荣耀6至尊版(麒麟928) 制式 TDD-LTE/TD-SCDMA/GSM TDD-LTE/TD-SCDMA/GSM TDD-LTE/FDD-LTE/WCDMA/GSM TDD-LTE/FDD-LTE/WCDMA/GSM TDD-LTE/TD-SCDMA/GSM 制式解读 移动4G\3G\2G 移动4G\3G\2G 移动4G\2G、联通4G\3G\2G 移动4G\2G、联通4G\3G\2G 移动4G\3G\2G NFC 不支持 支持 不支持 支持 支持 RAM 3G 3G 3G 3G 3G ROM 16G 32G 16G 32G 32G 价格 1999 2299 1999 2299 2999 上市时间 7月1日 7月22日 7月22日 8月初 10月 备注:关于全部荣耀手机支持的制式,你可以参考《荣耀家族制式说明》

2014年7月19日 · 1 分钟

7月22日华为荣耀准备了什么

第一:荣耀6 联通版荣耀6 32G版荣耀6,带NFC哟 全天购买无需预约 来源:华为荣耀掌门人@刘江峰_荣耀 官方微博: 第二、荣耀x2(猜测) 大屏荣耀X2要来了。 来源:@刘江峰 _荣耀、@华为荣耀 官方微博 第三、荣耀新玩具 类似于地雷一样的外形的新玩具,目前还不知道它的真面容。 来源 @华为荣耀酷玩 官方微博

2014年7月17日 · 1 分钟

目录调整如何不影响百度收录

因为历史原因,我的文章分类和标签url分别设成了下面这样子 http://zhaoyanblog.com/archives/category/website http://zhaoyanblog.com/archives/tag/angularjs 显然是不怎么简洁的,我现在要调整成 http://zhaoyanblog.com/category/website http://zhaoyanblog.com/tag/angularjs 但是目前我的博客已经被百度收录了,这么一改的话,肯定会出现大批收录的url为死链,返回404。 百度站长平台提供了一个“网站改版”改版的功能。你可以提交要改版的目录 例如:http://zhaoyanblog.com/archives/tag 表示原来这些路径下面的url都改版了。 但是前提是,原来的url要使用301跳转指向对应的新url,百度会在一个月时间内更新索引。301跳转就是http的状态码,表示永久跳转。并告诉浏览器一个新的地址,浏览器自动完成页面跳转。 要实现301跳转,还要使用.htaccess文件,在里面加入下面的话: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^zhaoyanblog.com$ RewriteRule ^archives/category/(.)$ category/$1 [R=301,L] RewriteRule ^archives/tag/(.)$ tag/$1 [R=301,L] </IfModule> 注意,如果你有多个重写<IfModule mod_rewrite.c>,它们之间是有执行顺序的,其中一个是伪静态url,就是把archives/category/website 这样的路径,当做参数传递给index.php,伪静态url的目的就是利于SEO。这个我在《SEO我做了哪些优化》中有说过。 所以这个301跳转必须发生在,伪静态url那个<IfModule mod_rewrite.c>前面。 写好之后,这样就设定好了301跳转。 设定好了之后,我发现我的一些中文tag有点问题,例如 访问:http://zhaoyanblog.com/archives/tag/勇敢做自己。 返回301跳转到了 http://zhaoyanblog.com/tag/%D3%C2%B8%D2%D7%F6%D7%D4%BC%BA 还是返回404. 原因是我的网站使用的是utf-8编码,而我使用的apache服务使用了GBK编码 例如上方“%D3%C2%B8%D2%D7%F6%D7%D4%BC%BA”是“勇敢做自己”的GBK编码。 所以要修改apache的url编码格式为utf-8。这样中文跳转就没问题了: http://zhaoyanblog.com/tag/%E5%8B%87%E6%95%A2%E5%81%9A%E8%87%AA%E5%B7%B1 我使用的西部数码的虚拟机提供了修改服务器url编码这样的选项,如果你直接自己搭建的apache或者nginx服务器,如果有上面的问题,可能需要自己修改相关的配置了。

2014年7月16日 · 1 分钟

7.22华为有新品 或为大屏荣耀X2

才发现@华为荣耀 官方微博昨日挑战小米4的微博,简单一句话"我X,7.22!",配图一副。预示着华为荣耀真的有新品要与大家见面了,相对于小米的难产,华为荣耀的新产品是一个接一个啊。 @华为荣耀 7月14日微博配图: 同时以#荣耀爱XX,新品大猜想#为主题,进行竞猜有奖活动,多数人猜为荣耀x2 难道这个就是荣耀掌门人刘江峰13日晚拿着看世界杯的神器?

2014年7月15日 · 1 分钟

荣耀要出荣耀电视?

荣耀掌门人刘江峰2014年7月13日晚23点发出一篇看世界杯的微博,说身边没有电视,但是拿到了一款新品,痛痛快快看球了。。。 不禁让人浮想联翩,荣耀要出电视了?还是出一款荣耀平板?。。。。 欧耶,一起期待吧。。。。

2014年7月15日 · 1 分钟

[翻译]G1垃圾收集器(八) 之 总结

在本教程,你已经对java虚拟机中的G1垃圾收集器有了大概的了解,首先你学习了堆内存以及GC为什么是java虚拟机里的关键组成部分。接下来你学习了CMS GC和 G1 GC两款GC是如何工作的。后面又学习了G1的命令行参数,和使用它们进行最佳实践。最终你学习了GC日志中包含的日志和数据有关的信息。 在本教程,你学到了: java JVM的组成 G1 GC的概述 回顾了CMS收集器 回顾了G1收集器 命令行参数和最佳实践 关于G1的日志 资源 获取更多的信息或者相关的知识,可以访问以下站点或者链接 Java HotSpot VM Options The Garbage First(G1) Garbage Collector Poonam Bajaj G1 GC Blog Post Java SE 7: Develop Rich Client Applications Java Performance - Charlie Hunt and Binu John Oracle Learning Library 感谢 课程开发者:Michael J Williams 校正:Krishnanjani Chitta

2014年7月14日 · 1 分钟

相比荣耀6,小米4可能有什么?

小米终于耐不住寂寞将于2014年7月22日发布自己的全新产品小米4了。在这里我们猜测一下相对于全能王荣耀6,小米4可能有什么。 1、首先可以猜到的是小米4将使用苹果的金属一体成型技术。这就是说小米4的外观将又有所改变。我们知道小米3相较于小米2,外观上进行了很大改变,上下屏幕之外的部分很多,边框很宽,整体风格抄袭lumia,被很多人诟病。 这次小米4的外观,又要进行很大的改变,首先它不能过分的抄袭苹果,其次它不能抄袭锤子和荣耀6。那么在金属一体成型的技术重在体现手机的整体感,小米采用这种技术,外观的设计发挥余地很小,除非小米敢承担这部分工艺成本,虽然金属一体成型技术可能是个亮点,但是我还是觉得小米4的外观这次又要被吐槽了。 2、内存和CPU 要想与目前的主流性价比超高的手机抗衡。内存3G 和 8核CPU是少不了的。小米一向喜欢弄个“全球首发”的噱头,我想这次肯定也不例外。CPU移动的可能用英伟达的,联通的可能用高通还未量产的骁龙810。除非小米不要追逐麒麟920的cat6。 根据以往的经验, 小米2 2012年8月16日发布 2012年10月30日销售 小米3 2013年9月5日发布 2013年10月15日移动版发布 2013年12月31日联通版发布。 使用英伟达的移动版小米4,你可能在8月底才可以拿到。至于使用全球最快的CPU的联通版小米4,你可能要到3到4个月之后拿到了。 3、屏幕 小米一向在屏幕上不敢下血本的,屏幕一直使用IPS屏幕材质,相反荣耀系列一直在使用LTPS.小米3用的是OGS全贴合技术,这次可能会向荣耀6看齐。0GS比IN-CELL通透性和成品率上要高。小米3选用OGS无疑是为了降低成本。IN-CELL虽然技术难度大,成品率低,但是比OGS更轻薄,屏幕轻度高,触控灵敏度低。 4、操作系统 MIUI是小米的一个优势,这次如果出个MIUI V6可能会有更大优势,在我看来,安卓操作系统的定制已经走到一个举步维艰的状态,我觉得MIUI不会太多的惊喜,雷军在引入虎哥之后,可能在性能、功耗、优化等啥啥的上面有所标榜。

2014年7月13日 · 1 分钟

国际范P7和屌丝范荣耀6

自荣耀6发布以来,好多人认为荣耀6的定价是对之前发布的P7的一个冲击,是自己把自己搞死了,为什么荣耀6的那么高的配置,会比P7还便宜呢?我觉得这应该和产品定位不同,追求不同,面向人群不同,销售市场渠道不同有关。 P系列手机,一直是华为的旗舰机,P1是华为高端手机的发迹产品,从华为P1开始,华为的高端机从此被市场承认。从P1 P2 P6 到现在的P7,P系列一直走的是高端路线,讲的是超薄,优雅和商务,它可能没有超高性能的配置。但是它有高级顶端的工艺,和超级用心的艺术设计。可以说它卖的更多的不是机器,而是工艺。 它面向的用户不是普通消费者,它面向的国际主流的用户的手机认识,还有一些商务人士,或者讲对苹果手机比较热衷,对手机当艺术品追求的人们。 华为P7,并不依赖于网络出售,它的销售渠道更多的是专卖店,运营商。这个做法和iphone类似。2888元这样裸机价格,会凸显实体店的打折优惠以及运营商套餐价格的优惠。让华为P7的合作伙伴们得到更大的利益。同时这样的价格会让华为P系列一直走顶级工艺,高端设计的路线。 再看荣耀系列,从荣耀1代开始,直到荣耀3c 3x,华为荣耀才找清楚自己的定位,荣耀要做一部性价比高的手机,就像荣耀总裁刘江峰说的:好多年轻人都和他说想要一部内存更大,运行更快,摸起来不要太烫,看起来更漂亮,拍照更清晰…的手机。可能这就是华为荣耀的定位,追求的是更高的性能,最佳的性价比。 首先价格便宜也是这部分人所希望的。而华为正好是有这方面能力的,它有自己的工厂,有自己的CPU,有20年通信行业的积累。它有别的手机厂商所无法具备的超高性价比的控制能力。别的厂商可能为了降低价格,会牺牲工艺来满足制造成本,牺牲质量来满足产量和尽早的上线出售。这是一方面,再加上华为荣耀也采用互联网销售,省去了中间的利益环节,所以华为荣耀在国内千元机市场是有绝对的优势的, 综上所述,荣耀6和华为P7并不冲突,首先荣耀6的优点是超高性价比,同时有质量和价格优势。华为P7的优点是顶尖工艺,高端设计。其次荣耀6面向的互联网销售,华为P7是传统销售渠道,P7的海外销售市场占很大比例。换句话说荣耀6走的是屌丝逆袭的道路,P7走的高富帅的国际范。

2014年7月11日 · 1 分钟

[翻译]G1垃圾收集器(七) 之 G1 GC记录日志

最后一个主题,我们主要介绍使用日志信息分析G1 GC的性能。本节提供了在日志中打印关于垃圾收集的数据和信息的开关选项。 设置日志详情 有可以设置日志详情到三种不同的级别 (1) -verbosegc (等同于 -XX:+PrintGC) 设置日志到 fine 级别. 例子: [GC pause (G1 Humongous Allocation) (young) (initial-mark) 24M- >21M(64M), 0.2349730 secs] [GC pause (G1 Evacuation Pause) (mixed) 66M->21M(236M), 0.1625268 secs] (2) -XX:+PrintGCDetails 设置为 finer 级别. 这个选项输出下面的信息 平均、最大和最小的暂停时间 根区域扫描, RSet 刷新(包括处理缓存信息), RSet扫描, 对象复制, 消亡(包括尝试的次数). 还包括其它操作使用的时间,例如CSet的选择, 引用的处理, 引用队列的入列,还有Cset的释放 显示Eden, Survivors区域以及总堆内存的占用情况 例子: Ext Root Scanning (ms): Avg: 1.7 Min: 0.0 Max: 3.7 Diff: 3.7] [Eden: 818M(818M)->0B(714M) Survivors: 0B->104M Heap: 836M(4096M)->409M(4096M)] (3) -XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest 设置到finest级别,内容就行finer级别的一样,再加上每个工作线程的信息 例子: ...

2014年7月10日 · 3 分钟

[翻译]G1垃圾收集器(六) 之 命令行选项和最佳实践

命令行选项和最佳实践 在这个章节,让我们一起看看G1的每个命令行选项。 基本的命令行选项 启用G1 GC,使用选项:-XX:+UseG1GC 这是一个最简单的命令行,来启动下载的JDK自带的demos和例子中的Java2Demo java -Xmx50m -Xms50m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar 关键的命令行开关 -XX:+UseG1GC - 告诉JVM,使用G1 GC -XX:MaxGCPauseMillis=200 - 设置一个目标最大暂停时间. 这是一个理想化的目标,JVM会尽可能的完成它. 因此,这个目标不一定能达到。默认是200ms。. -XX:InitiatingHeapOccupancyPercent=45 - 整个堆栈使用达到百分之多少的时候,启动GC周期. 基于整个堆,不仅仅是其中的某个代的占用情况,G1根据这个值来判断是否要触发GC周期, 0表示一直都在GC,默认值是45(即45%慢了,或者说占用了) 最佳实践 在使用G1的时候,下面几个最佳实践你需要遵循 不要设置年轻代大小 显式的使用-Xmn设置年轻代的大小,会干预G1的默认行为。 G1就不会再考虑设定的暂停时间目标,所以本质上说,设定了年轻代大小就相当于禁用了目标暂停时间 G1就无法根据需要增大或者缩小年轻代的小心。既然大小固定了,就无法在大小上做任何改变了。 响应时间指标 不要根据平均响应时间(ART)作为衡量标准去设定XX:MaxGCPauseMillis=<N>选项,而是设定一个想在90%或者以上的时间都会满足这目标的值。也就是说90%的用户,都会在目标时间,甚至更短的时间内得到响应。记住设定的目标时间只是一个目标,不能保证永久都会满足这个目标。 什么是释放(撤销?)失败? 一个JVM当在回收存活或者晋升对象的时候,栈区域溢出了就会发生失败,因为堆的使用已经到达了最大值,不能再扩展。使用-XX:+PrintGCDetails选项,你会看到to-space overflow的日志。这个过程代价很高的。 GC还必须继续对内存进行释放 拷贝不成功的对象继续留在原来的区域 对CSets中对区域的RSets任何更新都要重新生成 所有这些过程代价都是很高的 怎么避免释放(撤销?)失败? 为了避免放失败,考虑使用下面的选项: 增大堆(内存)大小 增大-XX:G1ReservePercent=n,默认是10 G1会预留一部分内存,制造一个假天花板,防止to-space的方式。 早点启动标记周期 增大并行标记的线程数,使用-XX:ConcGCThreads=n选项 G1 GC的开关选项完全列表 下面是G1 GC的所有的开关选项的列表,记得通过上面提到的最佳实践: 选项和默认值 描述 -XX:+UseG1GC 使用G1 GC -XX:MaxGCPauseMillis=n 设置一个暂停时间期望目标,这是一个软目标,JVM会近可能的保证这个目标 -XX:InitiatingHeapOccupancyPercent=n 内存占用达到整个堆百分之多少的时候开启一个GC周期,G1 GC会根据整个栈的占用,而不是某个代的占用情况去触发一个并发GC周期,0表示一直在GC,默认值是45 -XX:NewRatio=n 年轻代和老年代大小的比例,默认是2 -XX:SurvivorRatio=n eden和survivor区域空间大小的比例,默认是8 -XX:MaxTenuringThreshold=n 晋升的阈值,默认是15(译者注:一个存活对象经历多少次GC周期之后晋升到老年代) -XX:ParallelGCThreads=n GC在并行处理阶段试验多少个线程,默认值和平台有关。(译者注:和程序一起跑的时候,使用多少个线程) -XX:ConcGCThreads=n 并发收集的时候使用多少个线程,默认值和平台有关。(译者注:stop-the-world的时候,并发处理的时候使用多少个线程) -XX:G1ReservePercent=n 预留多少内存,防止晋升失败的情况,默认值是10 -XX:G1HeapRegionSize=n G1 GC的堆内存会分割成均匀大小的区域,这个值设置每个划分区域的大小,这个值的默认值是根据堆的大小决定的。最小值是1Mb,最大值是32Mb

2014年7月9日 · 1 分钟

[翻译]G1垃圾收集器(五) 之 G1 GC的步骤(下)

G1的老年代GC 像CMS收集器一样,在老年代的GC上,G1 GC被设计成一个低暂停的收集器。下面的表格描述了G1 GC在老年代上收集的各个阶段。 G1收集阶段-并行标记阶段周期 G1老年代收集的各个阶段如下,请注意有些阶段也是年轻代GC的一部分。 阶段 描述 初始化标记(stop_the_world事件) 这是一个stop_the_world的过程,是随着年轻代GC做的,标记survivor区域(根区域),这些区域可能含有对老年代对象的引用。 根区域扫描 扫描survivor区域中对老年代的引用,这个过程和应用程序一起执行的,这个阶段必须在年轻代GC发生之前完成。 并发标记 查找整个堆中存活的对象,这也是和应用程序一起执行的。这个阶段可以被年轻代的垃圾收集打断。 重新标记(stop-the-world事件) 完成堆内存活对象的标记。使用了一个叫开始前快照snapshot-at-the-beginning (SATB)的算法,这个会比CMS collector使用的算法快。 清理(stop-the-world事件,并且是并发的) 对存活的对象和完全空的区域进行统计(stop-the-world) 刷新Remembered Sets(stop-the-world) 重置空的区域,把他们放到free列表(并发)(译者注:大体意思就是统计下哪些区域又空了,可以拿去重新分配了) 复制(stop-the-world事件) 这个stop-the-world的阶段是来移动和复制存活对象到一个未被使用的区域,这个可以是年轻代区域,打日志的话就标记为 [GC pause (young)]。或者老年代和年轻代都用到了,打日志就会标记为[GC Pause (mixed)]。 G1老年代手机的详细步骤 根据上面的阶段定义,来让我们看看他们都是和老年代怎么交互的。 6、初始化标记阶段 初始化标记,是在年轻代垃圾回收的过程中发生的,在日志中标记为GC pause (young)(inital-mark). 7、并发标记阶段 如果空的区域发现(图中标记为“X”),他们就会在重新标记阶段被立即清除掉,同时决定活跃度的统计信息也会计算到。 8、重新标记 空的区域被删除回收,同时计算所有区域的区域活跃度 9、复制和清理阶段 G1 GC会选择活跃度最低的区域进行收集,因为这些区域的垃圾收集会更快一点,在收集的过程中,年轻代的GC也可能同时发生,所以在GC的日志中标记为 [GC pause (mixed)],意思就是年轻代的GC和老年代的GC可以同时发生。 10、复制和清理阶段之后 那些选择收集的区域,存活对象会被压缩到图中标注的深蓝色区域和深绿色区域。 ...

2014年7月8日 · 1 分钟

[翻译]G1垃圾收集器(五) 之 G1 GC的步骤(上)

G1 GC采用不同的方式分配内存,下面这些图片用来解释G1系统的原理 1、G1的堆结构 堆是一块内存区域分成许多固定大小的区域 区域的大小由JVM启动的时候决定的,一般在1-32M范围内,大约生成2000个左右。 2、G1堆的分配 事实上,这些区域在逻辑上被映射到三大区:Eden, Survivor, 和老年代 图片中的颜色表示了区域和它被赋予的角色,存活的对象被腾挪(复制或者拷贝),从一个区域到另一个区域。区域中的收集被设计成和应用程序并行的。 如图所示,区域可以被分配为Eden, Survivor, 和老年代区域,此外还有第四种,我们称之为Humongous区域。这些区域被设计为保存一个标准区域大于50%的对象。他们被存储为一块连续的区域。这种类型的区域必须是没有被使用的区域(译者注:翻译到这里,暂且不明白,接着往下读) 注:在写这篇文章的时候,对Humongous对象的收集还没得到优化,你应该避免创建这样打的对象。(译者注:更云里雾里了,这个Humongous是指一个区域的类型,还是一些对象的类型呢?) 3、G1中的年轻代 堆被分成接近2000块区域,最小1Mb,最大32Mb。蓝色区域存储老年代对象,绿色区域存储年轻代对象。 注:这些区域不需要像老的GC那样必须是连续的 4、G1中年轻代的收集 存活的对象被复制或者移动到一个或多个survivor区域,如果满足老化阈值,这些对象就会被晋升到老年代(译者注:老化、晋升的概念就是说,一个对象在经历n个周期的收集仍然存活,这个对象就是可能被程序长期持有不愿释放的对象,这个对象就算是老化了,晋升到老年代) 这个阶段会发生stop the world的暂停,Eden和survivor的大小需要计算,为了进入下一次的年轻代收集,一些信息的统计也同时进行,为了帮助这个计算。设定的目标暂停时间也会纳入考虑的因素。 这个方法让改变这些区域大小变的容易,根据需要增大或者减少。 5、年轻代GC之后 存活的对象已经被复制或者移动到survivor和老年代区域。 刚晋升的对象如深蓝色所表示,绿色的表示survivor区域 总结一下,关于年轻代的GC有如下几点: 一整块堆内存被分成多个小区域 年轻代是由一些列的不连续的区域组成的,这有助于随时改变它的大小 年轻代的垃圾收集,或者称年轻代GC,是stop-the-world的一个事件,所有的应用程序线程必须停止,等待这个操作完成。 年轻代的GC,又多个线程并行处理 存活的对象被复制或者移动到新的survivor区域或者老年代区域

2014年7月7日 · 1 分钟

[惊喜]百度广告从基础升通用了

从建站伊始我就加入了百度联盟,加入百度联盟门槛不高: 1、有内容,你的网站必须有一定的内容,合法的。如果你刚刚建站,就几篇文章可能会申请失败,你需要充实之后再次申请。 2、有备案,如果你是个国内网站你必须有备案,不过如果你是香港主机或者境外网站的就不需要了。 满足这两个条件就可以在百度联盟网站注册一个用户,中间要验证下自己的网站。就可以投放自己的广告了。 你的网站有两个等级:基础和通用。如果你的网站流量很大,或者内容很丰富,上来审核员可能就给你一个通用级别。那下面的问题就不需要看了。 如果你的网站流量不是很大,内容还不怎么丰富,那你就是基础级别,然后你无论投放的什么百度广告,都是显示的主题广告。主题广告的原理很简单,就是百度联盟广告js,会从你投放广告的页面抓取内容,提取关键字以链接显示出来,用户点击你的主题链接,就会进入围绕这个主题的百度广告页面。这样单调的广告,肯定让你的网站看着很丑陋。 为此我们要努力从基础变成通用,变成通用的条件,一是流量,而是内容,像一个网站的流量基本来源于搜索引擎,所以最终还是要从内容着手,主要从以下几方面 第一:虽然联盟广告,你目前只能做主题广告,但是你也要多加几个,增加展现量。 第二:百度联盟和百度统计是相通的,我相信百度联盟的广告统计展现量是用了百度统计的相关技术,或者是数据有共享,你的网站要加入百度统计代码,不要用cnzz的。 第三:你的网站一定要主题明确,因为百度联盟的广告原理就是根据你的网站内容推送相近内容的广告,所以你一定要围绕一个主题充实你的网站。这就是SEO的话题了,关于SEO其它方面的建议,你可以参考我的《SEO我做了哪些优化》《SEO我做了哪些优化(续)》,或者其它网站的资料。 第四:最重要的还是坚持每天更新原创内容。我就是每天都坚持更新一篇自己原创的文章,最终从基础变成通用的,虽然我的每天的网站流量不是很大。我想我只所以从基础变成通用,是因为百度联盟检测到我的内容原创度高,内容丰富了。百度搜素检测文章是否远程的算法还是有一套的,我发现我之前关于《java多线程学习》的几篇总结,一直没有被收录,这是因为关于这方面的内容,网上实在太多了。你的内容是否原创度高,百度搜索索引量是个间接的反映。

2014年7月7日 · 1 分钟

[翻译]G1垃圾收集器(三) 之 G1垃圾收集器

G1 GC 垃圾优先收集器(G1 GC) 是一个服务器型的垃圾收集器,它的目标是大内存,多处理器的机器。高概率的满足一个垃圾回收暂停时间的目标下,实现大吞吐量。(译者注:例如设置的垃圾回收暂停时间是200ms,G1可以保证90%的垃圾回收暂停时间都在200ms以内,从而保证大的吞吐量),在jdk1.7update4 及其以后的版本完全支持G1 GC,G1 GC主要是为下面这样的应用设计的: 就像CMS收集器一样,可以和应用线程并行处理 紧凑的空间,不会因为GC导致长时间的暂停 GC的暂停时间,希望更多的是可以预见的(译者注:意思就是说,大部分GC时间都是可以控制的,因为G1可以保证90%的GC都在目标时间以内) 不想牺牲大吞吐量的性能 不需要更大的内存 G1 GC的长期计划,就是为了替代CMS GC。比较CMS GC和G1,他们很多不同点表明G1 GC是个更好的解决方案。其中一个不同点就是G1是一种压缩收集器,G1对堆栈的充分压缩,可以避免使用细粒度的未分配内存列表去分配内存,而是使用region的概念。这大大简化了收集器的部分,更大程度上消除了潜在的碎片问题。此外,G1比CMS提供了更多的对收集暂停时间的预测,允许用户设定暂停时间期望目标。 G1操作概述 老的垃圾收集器(像serial,parallel,CMS),全部把堆栈划分成三个区域:年轻代,老年代,以及固定大小的永久代。 所有的对象,最终在三个区域中的一个中消亡。 G1 GC采用不同的方式: 堆被分成一组大小相等的区域,每一块区域对应虚拟机的一片连续内存。他们就像那些老的GC一样,也分成三组(Eden,Survivor,Old)。但是这三种区域没有固定的大小,这在内存使用上提供了更大的灵活性。 G1 GC的执行过程,和CMS有很大类似,G1首先并行进行一个全局的标记,来确认堆内的所有对象的活跃度。在经过标记阶段之后,G1 GC就知道哪些区域大部分都是闲置的。G1 GC首先收集那些可以产生大片空白内存的区域,这就是为什么G1 GC被称为垃圾优先。就像名字一样,G1 GC聚焦它的收集和压缩能力在那些就要被可回收对象(也就是垃圾占满的区域。G1有一个可预测的时间暂停模型,可以让用户指定一个目标,这个模型基于实现这个目标来选择每次收集的区域的个数。 那些有G1确认已到回收时机的区域使用撤离的方式进行回收垃圾。G1从一个或者多个区域中复制对象集中到一个区域中,在复制的过程中进行压缩和释放内存。这个撤离的过程在多处理器中是必行处理的,目的就是减少暂停时间和增大吞吐量。因此每次垃圾收集,G1 GC都要在用户设定的暂停时间内不断的工作,以减少碎片的产生。CMS收集器不会做压缩工作,老的Parallel收集器之做全堆的压缩,这会导致相当大的暂停时间。 有一点要特别注意,G1 GC不是一个实时的收集器,它只是说更大可能的满足你设定的暂停时间,但是也不是一定的。通过前面的收集,G1 GC会大体估算出来在你指定的目标时间内能够收集多少区域。因此G1 GC有一个对收集成本的考量模型,G1 GC通过这个模型来决定哪些,多少区域需要收集来保证这个暂停时间目标。 注意:G1 GC有并发和并行的两种阶段,例如refinement, 标记, 清除阶段,是并发执行,stop-the-word是并行处理的(译者注:并发和并行的概念要研究下)。Full GC仍然是单线程处理的,但是如果你调优的恰当,这种情况是可以避免的。 G1 自占内存 如果你是从老的Parallel GC或者CMS GC转到G1,你会发现更的进程占用,这主要和统计类的数据结构有关,例如Remembered Sets和Collection Sets。 Remembered Sets简称RSets,跟踪一个区域内对象的引用,在堆内,每一块区域对应一个RSet。RSets能让每个区域的收集都是独立并行的。RSets整体占小于5%的内存。 Collection Sets 简称CSets,是GC中需要收集的区域的集合,在一个GC过程中,CSets中所有的活动的数据都要被挪动(包括移动和复制),CSets可以是Eden, survivor, old任意类型的区域,Csets对jvm的大小(译者注:只要是说内存吧)有小于1%的影响。 推荐使用G1 GC的情形 G1第一个关注点是,为那些需要大内存,低GC时延的应用提供一个解决方案。也就是说内存可以到6G甚至更大,可以保证在0.5秒以下稳定的暂停时间。 使用CMS GC和老Parallel GC的应用程序,在有以下一个或者多个特征的情况,比较适合切换到G1 GC: ...

2014年7月6日 · 1 分钟

[翻译]G1垃圾收集器(四) 之 回顾GC以及CMS

回顾分代GC和CMS、 并发标记扫描收集器(CMS),也被称作低暂停并发收集器。它是回收老年代。它试图利用和应用线程并发的收集尽可能多的垃圾,以减少因为垃圾收集导致的停顿。通常这种低延迟并发收集器不会对活动的对象进行压缩处理,也就是说它只做一个不对对象进行移动的垃圾回收,那么配分一个更大的内存的时候,碎片就会成为一个问题。 注意:CMS收集器在年轻代中使用和parallel 收集器相同的算法。 CMS收集阶段 CMS收集器在堆的老年代的回收上有以下几个阶段: 阶段 描述 初始化标记 (stop-the-world事件) 标记老年代中依然存活的对象,包括那些从年轻代晋升来的,这个过程通常比较短暂(译者注:存活我理解为被程序引用,不可回收的对象) 并发标记 和应用程序并发执行的,扫描整个老年代,是从那些标记的对象,或者间接标记的对象开始扫描。第2、3、5个阶段是并发执行的,在这个过程中,在CMS的代中新分配的对象(包括晋升的对象)会被立即标记为存活状态。 重新标记 (stop-the-world事件) 该阶段发现那些被并发标记错过的对象,因为并发标记是和应用程序并发执行的,在标记线程完成对某个对象的跟踪那刻,应用程序可能对对象进行了更新。 并发清理 收集那些在标记阶段没有标记的对象,消亡对象所占的空间会被添加到释放列表里用于重新分配,对死亡对象的聚集工作就发生在这个点。注意:存活的对象不会被移动。 并发重置 做一些数据结构的清理工作,为下一次收集做准备 回顾垃圾收集的步骤 接下来,让我们回顾一下CMS GC的操作步骤: 1、CMS GC的堆结构 整个堆被分成三个部分 年轻代被分割成一个Eden和和两个survivor区域,老年代是延续空间,对象的收集就在这片区域,没有压缩操作直到一个full GC发生。(译者注:读到这里,我们应该很清楚压缩的意思就是说不仅仅对垃圾对象进行收集,还对存活的对象进行腾挪,聚集在一起,腾出更多的空间,不要让对象散落在不同的空间,这就是内存碎片,内存碎片导致无法分配一块连续的大内存) 2、在CMS中,年轻代的GC是怎么工作的? 年轻代被标记为绿色,老年代为蓝色,你的JAVA程序在运行一段时间后,可能会像下面这个样子.对象分散的分布在老年代中: 使用CMS,老年代是对象消亡的地方,它们不会被移动,也不会被压缩,除非遇到一个Full GC. 3、年轻代的收集 存活的对象从 Eden 区域或者一个 survivor区域,移动到另外一个survivor区域,一些老的对象如果达到了晋升阈值,就会被提升到老年代中。 4、年轻代GC之后 年轻代的收集之后,Eden区域和其中一个survivor区域会被清理 新晋升的对象是深蓝色区域,绿色区域年轻代中存活下来,还没有晋升到老年代的对象。 5、CMS中老年代的收集 两次stop_the_world的时间是初始化标记和重新标记阶段,当老年代达到一定的占有率,CMS才开始登场了。 (1)初始化标记是对存活的对象进行标记,只有短暂的停顿(2) 并发标记阶段,是和应用程序一起执行的,也害死标记存活的对象。最终在第(3)阶段去标记那些上一阶段(2)遗漏的对象。 6、老年代的收集-并发清理 在上一阶段没有被标记的对象会在这里消亡,这里没有压缩。 ...

2014年7月6日 · 1 分钟