您的位置:首页 > 其它

垃圾回收系列(4):GC性能调优及总结

2010-11-02 22:33 274 查看
本文为垃圾回收讲座第四篇,也是最后一篇。前三篇(


)分别介绍了手工管理内存带来的一些问题,一些经典的GC算法以及CLR与JVM在垃圾回收方面的比较。本文将会简单介绍垃圾回收性能调优的话题,以及给大家推荐一些垃圾回收的资料和开源项目。

GC性能调优

无论对于哪方面的调优,数据库调优、网络调优还是垃圾回收调优,其遵循的过程都是一样的:首先要评估现状,当前的状况是什么样的,收集相关的数据;
再次设定一个目标,即我们调优要达到什么目的,而不是盲目的进行调整;然后做一些调优方面的尝试,并对调优的结果进行验证,看看尝试调优的结果如何,最后
再进行一些细微调整。调优的过程不是一蹴而就的,而是我们可能要在反复去做这几个步骤,如下图所示:



在评估现状阶段,主要是收集现阶段的运行数据,典型的数据如:

a. 垃圾回收(新、Full GC)频率

b. 垃圾回收(新、Full GC)花费时间

c. 旧生代(第2代、大对象堆)对象数量

幸运的是,不管是在CLR上面还是JVM上,都有大量的工具能够帮助我们完成数据的收集:

CLR:CLR Profiler、VSTS、Windows Performance Monitor、Windbg + SOS

JVM:GC日志、GC Portal、JConsole、JVisualVM/VisualGC、JMap

如下图所示使用JConsole监控应用程序内存使用情况,以及GC时间等,完整的JConsole使用方法可以参考这里




下图为使用CLR Profiler查看托管堆上各代对象情况:



GC性能调优的第二阶段是确定调优的目标:如降低垃圾回收(新、Full GC)频率;减少垃圾回收(新、Full
GC)时间;减少由于垃圾回收造成应用程序暂停时间等等。接下来根据制定的目标进行一些优化,Full
GC频率太高,是因为有大量的新对象被提升,造成2代(旧生代)空间占满,从而导致Full GC太频繁,那我们就需要考虑降低Full
GC的频率,如是不是由于Finalize()方法导致;扩容2代(旧生代)大小(JVM);修改程序(缓存的东西太多)等。

上面只是简单介绍了GC性能调优的几个步骤,并没有特别具体介绍在CLR和JVM如何调优(说实话,在CLR上面,什么都不用去做,因为没得选择)。总之,在做GC性能调优时,牢记墨菲定律:

a. 任何事都没有表面看起来那么简单

b. 所有的事都会比你预计的时间长

c. 会出错的事总会出错

d. 如果你担心某种情况发生,那么它就更有可能发生

GC资料推荐

迄今为止,唯一一本介绍垃圾收集的书籍《Garbage Collection》,书中的内容相当全面,从垃圾回收算法到各种垃圾回收器,都有介绍,可惜中文版已经绝版:



全书共12章。第1章首先介绍计算机存储器管理的演化和自动内存回收的需求,并引入了本书所使用的术语和记法。第2章介绍了3种“经典”的垃圾收集
技术:引用计数(reference counting)、标记-清扫(mark-sweep)和节点复制算法(copying)。
随后的4章更详细地讨论了上述这些垃圾收集方式和标记-缩并(mark-compact)收集。第7章和第8章分别介绍了在现代垃圾收集实现中具有重要地
位的分代式(generational)垃圾收集和渐进式(incremental)垃圾收集。第9章和第10章扩展了垃圾收集的领域,讨论了如何让垃圾
收集能够在无法得到来自语言编译器的支持的环境(分别是C和C++)中运行。第11章讨论了一个相对较新的研究领域 --
垃圾收集和硬件数据cache的相互作用。第12章简要地考察了用于分布式系统的垃圾收集。

另外,研究垃圾回收还可以从开源项目中获益:

libgc
:开源的C/C++垃圾回收器实现,详细信息可以到这里
了解。另外,在Sun网站上有一篇文章
作了详细的介绍。

sscli:CLI的开源实现,只可惜从.NET 2.0之后就再也没有更新过,也是目前唯一可以了解CLR垃圾回收细节的源代码。

manualgc
:网易云风写的C垃圾回收器,代码只有短短的几百行,里面有些数据结构的设计相当精妙,大家可以学习一下。

至此垃圾回收讲座的系列文章就整理完了,由于PPT材料不能公开,只好以文章的形式为大家介绍,希望对大家有所帮助。前面三篇文章的链接:

垃圾回收系列(1):没有GC,世界将会怎样

垃圾回收系列(2):几种经典的垃圾回收算法

垃圾回收系列(3):CLR与JVM垃圾回收器的比较

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: