您的位置:首页 > 编程语言 > Java开发

Java的GC分代原理

2015-09-08 14:13 169 查看
  这话其实也没有太大问题,的确,大部分场景下关心内存、GC的问题,显得有点"杞人忧天"了,高老爷说过:

  过早优化是万恶之源。

  但另一方面,什么才是"过早优化"?

  If we could do things right for the first time, why not?

  事实上JVM的内存模型( JMM )理应是Java程序员的基础知识,处理过几次JVM线上内存问题之后就会很明显感受到,很多系统问题,都是内存问题。

  对JVM内存结构感兴趣的同学可以看下 浅析Java虚拟机结构与机制 这篇文章,本文就不再赘述了,本文也并不关注具体的GC算法,相关的文章汗牛充栋,随时可查。

  另外,不要指望GC优化的这些技巧,可以对应用性能有成倍的提高,特别是对I/O密集型的应用,或是实际落在YoungGC上的优化,可能效果只是帮你减少那么一点YoungGC的频率。

  但我认为,优秀程序员的价值,不在于其所掌握的几招屠龙之术,而是在细节中见真着,就像前面说的,如果我们可以一次把事情做对,并且做好,在允许的范围内尽可能追求卓越,为什么不去做呢?

  一、GC分代的基本假设

  大部分GC算法,都将堆内存做分代(Generation)处理,但是为什么要分代呢,又为什么不叫内存分区、分段,而要用面向时间、年龄的"代"来表示不同的内存区域?

  GC分代的基本假设是:

  绝大部分对象的生命周期都非常短暂,存活时间短。

  而这些短命的对象,恰恰是GC算法需要首先关注的。所以在大部分的GC中,YoungGC(也称作MinorGC)占了绝大部分,对于负载不高的应用,可能跑了数个月都不会发生FullGC.

  基于这个前提,在编码过程中,我们应该尽可能地缩短对象的生命周期。在过去,分配对象是一个比较重的操作,所以有些程序员会尽可能地减少new对象的次数,尝试减小堆的分配开销,减少内存碎片。

  但是,短命对象的创建在JVM中比我们想象的性能更好,所以,不要吝啬new关键字,大胆地去new吧。

  当然前提是不做无谓的创建,对象创建的速率越高,那么GC也会越快被触发。

  结论:

  分配小对象的开销非常小,不要吝啬去创建。

  GC最喜欢这种小而短命的对象。

  让对象的生命周期尽可能短,例如在方法体内创建,使其能尽快地在YoungGC中被回收,不会晋升(romote)到年老代(Old Generation)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: