阅读更多

3顶
0踩

编程语言

转载新闻 关于垃圾回收被误解的7件事

2015-04-27 09:55 by 副主编 mengyidan1988 评论(0) 有7969人浏览
对Java垃圾回收最大的误解是什么?它实际又是什么样的呢?

当 我还是小孩的时候,父母常说如果你不好好学习,就只能去扫大街了。但他们不知道的是,清理垃圾实际上是很棒的一件事。可能这也是即使在Java的世界中, 同样有很多开发者对GC算法产生误解的原因——包括它们怎样工作、GC是如何影响程序运行和你能对它做些什么。因此我们找到了Java性能调优专家Haim Yadid,并把名为Java performance tuning guide的文章发表在Takipi的博客上。

最新博文:关于垃圾回收被误解的7件事
http://t.co/3QJLJuKCRqpic.twitter.com/aqQEF0zTkK
— Takipi (@takipid) April 6, 2015

带着对性能调优指南浓厚的兴趣,我们决定在这篇后续的博文中收集一些关于垃圾回收的流行观点,并且指出为什么它们完全是错误的。

来看看前7名:
1. 只有一个垃圾回收器

不,并且4也是错误的答案。HotSpot JVM一共有4个垃圾回收器:Serial, Parallel / Throughput. CMS, and the new kid on the block G1。别急,另外还有一些非标准的垃圾回收器和更大胆的实现,比如Shenandoah或 者其他JVM使用的回收器(C4——Azul开发的无停顿回收器)。HotSpot默认使用Parallel / Throughput回收器,但它常常不是你运行程序的最佳选择。比如CMS和G1会使GC停顿(GC pause)发生的频率降低,但是对于每次停顿所花费的时间,很可能比Parallel回收器更长。另一方面来说,在使用相同大小堆内存的情况下,Parallel回收器能带来更高的吞吐量。

结论:根据你的需求(可接受的GC停顿频率和持续时间)选择合适的垃圾回收器。

2. 并行(Parallel) = 并发(Concurrent)

一个GC周期(Garbage Collection cycle)可以以STW(Stop-The-World)的形式出现,这会发生一次GC停顿,也可以并发地执行从而无需暂停应用程序。更进一步来 讲,GC算法本身可以是串行的(单线程),也可以是并行的(多线程)。因此当我们提到并发的GC时,并不代表它是并行完成的,相反当提到串行GC时,也并 不意味着就一定会出现GC停顿。在GC的世界中,并发和并行是两个完全不同的概念。并发针对的是GC周期,而并行针对GC算法自身。

结论:垃圾回收的过程实际上有两步,启动GC周期和GC自身运行,这是不同的两件事。
3. G1能解决所有问题

经过一系列修正和改 进,Java 7中引入了G1回收器,它是JVM垃圾回收器中最新的组件。G1最大的优势就是解决了CMS中常见的内存碎片问题:GC周期会从老年代(Old Generation)中释放内存块,结果内存变得像瑞士奶酪那样千疮百孔,直到JVM对其无从下手了,才不得不停下来处理这些碎片。但是故事没这么简 单,某些情况下其他回收器可能比G1有更好的表现,这完全取决于你的需求。

结论:没有一个奇迹般的回收器能解决所有GC问题,你应该通过具体实验来选择合适的回收器。
4. 平均事务时间是最需要被关注的指标

如 果你仅仅监控服务器的平均事务时间,那么很可能错过一些异常值。这些异常的情况可能对用户来说是毁灭性的,而人们没有意识到它的重要性。比如一个事务在正常情况下耗时100ms,但受到GC停顿的影响,花了1分钟才完成。除了用户没人会注意到这个问题,因为你只观察了平均事务时间。试想有1%或者更多的用 户经历了这个场景,如果只关注平均值,它就太容易被忽略了。想了解更多和延迟相关的问题和怎样正确处理,可以在这里阅读Gil Tene的博客。

结论:留心那些异常值,你可以知道系统最后那1%的状况。(可不是这个1%
5. 降低新对象的分配率可以改善GC的运行状况

我们可以 粗略地把系统中的对象分为三种:长命(long-lived)对象,对它们我们一般做不了什么;中等寿命(mid-lived)对象,最大的问题可能出现在这;短命(short-lived)对象,它们的释放和回收通常都很快,在下个GC周期来临时就会消失。专注于中等寿命对象的分配率可以带来有益的结 果,这对短命和长命的对象却不是那么有效。另外,控制中等寿命对象往往是一项困难的工作。

结论:给服务器带来压力的并不单纯是对象的分配率,在运行过程中这些对象的种类才是一切麻烦的根源。

6. 调优可以解决所有事

如果你的程序需要保存大量被频繁修改的状态,对JVM堆内存进行调优就无法带来很好的收益。较长的GC停顿是不可避免的。一个解决办 法是对架构进行改善,保证一个对响应时间有决定性影响或者造成瓶颈的过程中,不包含大量状态。大量状态和响应能力是难以良好共存的,因此将它们分开处理才 是上上之选。

结论:不是所有的问题都可以通过调整JVM参数解决,有时你只需要回顾自己的绘图板。(译注:重新审视程序的设计)
7. GC日志会导致巨大的系统开销

简单来说,这是错的,尤 其在默认的日志配置下。日志数据是极为有价值的,Java 7中还引入了钩子来控制它们的大小,保证硬盘空间不被用尽。如果不收集GC日志,那么你会失去这几乎是唯一的,知晓JVM垃圾回收器在生产环境中工作状态 的方法。一般可接受的GC开销以5%作为上限,如果你能知道系统为GC停顿付出的代价,也能对最小化这个代价采取行动,这种程度的开销是不值一提的。

结论:在能力范围内,尽可能多地获取系统在生产环境中的运行数据,你会发现那是一个全新的世界。

总结

希望上面的结论能帮助你们更好地把握Java垃圾回收器的工作。在你们的程序中出现过类似问题吗?你们周围还有没有其他对GC常见的误解?请在下面的评论区留言。

本文由 ImportNew - 蒋生武 翻译自 javacodegeeks
3
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Ext Js权威指南(.zip.001

    8.3.1 为元素添加阴影:ext.shadow与ext.shadowpool / 418 8.3.2 为组件提供阴影和shim功能:ext.layer / 419 8.3.3 让组件实现浮动功能:ext.util.floating / 420 8.3.4 记录组件状态:ext.state.stateful / ...

  • comboBox动态加载数据并支持多选(checkbox)

    function getTableName(){//获取后台数据,即要动态加载的数据 tableExportAction.getTableName(function(data){ tableStore=data; // allcomb = [['全部','全部']]; // tableStore.unshift(allcomb[0]); ...

  • 对Extjs下拉列表动态添加和删除数据

    最近开发中遇到一个问题,就是动态的往下拉列表中添加和删除数据。经过各种查文档加搜索,终于解决了。以下是我的代码: 首先,我需要点击别的模块时动态删除下拉列表中的某些选项,所以添加单击监听事件: ...

  • ext combobox getValue

    使用combobox时,它有一个hiddenName的属性,专门用于提交combobox中value的值....使用Ext.get('comboId').dom.value方法获取的是combobox中选中项的文本text值, 使用Ext.get('hiddenValue')....

  • Ext.form.ComboBox 完整属性

    Ext.form.ComboBox 类全称: Ext.form.ComboBox 继承自于: Ext.form.TriggerField   一个提供自动完成、远程加载、分页和许多其他特性的组合框。   配置项 1、transform : Mixed  要转换为组合...

  • Ext 动态生成checkbox及清除的解决方法

    Ext 动态生成checkbox及清除的解决方法 EXT 1. 在formpanel中定义有一个panel:  {   xtype : 'panel',   title : '请选择用户所查看的报表',   id : 'reportRoleFieldset',   autoHeight : ...

  • 71.Ext.form.ComboBox 完整属性

    Ext.form.ComboBox 类全称: Ext.form.ComboBox 继承自于: Ext.form.TriggerField 一个提供自动完成、远程加载、分页和许多其他特性的组合框。 配置项 1、transform:Mixed 要转换为组合...

  • Ext.form.ComboBox

    类全称: Ext.form.ComboBox继承自于: Ext.form.TriggerField 一个提供自动完成、远程加载、分页和许多其他特性的组合框。 配置项1、transform : Mixed 要转换为组合框的id,DOM节点或者已有的select元素。

  • EXT 中文手册

    EXT 中文手册 前 言 本手册所有内容均粘贴自互联网,如有错误,请多见谅。 目 录     EXT中文手册 1 EXT简介 3 目錄 3 下载Ext 4 开始! 4 Element:Ext的核心 4 获取多个DOM的节点 5 响应事件 5 ...

  • Ext.Net 1.x_Ext.Net.Combox动态加载与删除所选择项

    <ext:FieldTrigger Icon="Clear" Qtip="移除选项" /> (this.getValue());this.clearValue();" /> </ext:ComboBox> 后台; string strSql = string.Format("select distinct [name] as username,...

  • ExtJS笔记--Ext.form.ComboBox

    Ext.form.ComboBox 类全称: Ext.form.ComboBox 继承自于: Ext.form.TriggerField   一个提供自动完成、远程加载、分页和许多其他特性的组合框。   配置项 1、transform : Mixed  要转换为组合框的id...

  • 70、ExtJs的combobox的监听事件

    ExtJs的combobox的监听事件

  • 第2章[2.5] Ext JS组件、容器与布局

    基于Ext JS的应用的UI由组件(Component)组成。这和绝大部分界面开发语言的概念是类似的。 Ext JS使用的是面向对象的概念, 有组件类与组件实例的概念,组件实例也常简称为组件。组件类之间可以有继承关系。 Ext JS...

  • Ext开发指南

    EXT开发指南 目 录 一、 EXTJS框架下载: 2 二、 EXTJS使用… 2 页面引用... 2 ExtJS 调用... 2 组件体系下图所示:... 3 组件的使用... 4 组件的配置属性... 5 三、 各功能组件使用方法及...

  • ext组件转换成html,Ext.js的组件体系

    一 . Ext的组件大致可以分成三大类,即...基本组件有:xtype Classbox Ext.BoxComponent 具有边框属性的组件Button Ext.Button 按钮colorpalette Ext.ColorPalette 调色板component Ext.Component 组件container E...

  • combobox空间clear清空选中、loadData清空option、getValue获得选中、setValue设置值之简单粗暴教程

    $('#id').combobox('clear');//清空选中项 $('#id').combobox('loadData', {});//清空option选项 var selectedId= $("#id").combobox("getValue");//获得选中项,当选中多个时为带逗号数组 $('#id').com...

  • EXT.NET(二十三)Combox动态加载与删除所选择项

    ext:ComboBox ID="cbxsalesman" runat="server" FieldLabel="业务员" Width="150" DisplayField="UserName" ValueField="UserId" StoreID="Store...

  • 基于vue的菜谱网站,前端采用vue,后端采用express,数据库采用mysql。.zip-毕设&课设&实训&大作业&竞赛&项目

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

  • 数据分析全流程指南:从基础知识到实战项目的Python&R生态应用

    内容概要:本文档提供了关于数据分析全面的知识介绍与实战资源链接。首先,在数据分析的基础教程部分讲述了使用Python以及R两种语言来进行实际的数据分析工作所需具备的各项基本技能。其次,进阶教程涵盖从机器学习到深度学习的概念及其Python具体应用场景。接着,在工具有效利用层面介绍了多种热门库与平台的作用特点。在项目实践中,列举了四个实战案例:Titanic幸存者预测、房价预测、社交媒体情感倾向分析以及市场顾客购买模式研究,每个项目都有详细的技术流程指引。另外列出多个外部网站资源供进一步提升学习。 适用人群:本文主要面向有志于从事数据挖掘工作的学生和技术爱好者,同时也可辅助在职人士自我能力进阶。无论是在学术科研还是实际业务需求环境中都值得研读。 使用场景及目标:学习者将能够获取到系统的理论知识体系,熟悉业界主流软件包的功能优势,掌握具体业务问题解决方案路径,提高自身的综合技术素质,从而为个人职业规划增添竞争力。 其他说明:文档里推荐了不少高质量参考资料和实用线上学习社区,能有效补充专业知识空白并促进社交协作交流。

  • 从埃安泰国工厂竣工看中国车企加快海外建厂步伐.pptx

    从埃安泰国工厂竣工看中国车企加快海外建厂步伐.pptx

Global site tag (gtag.js) - Google Analytics