通常来说,要写Java代码,你基本上都没必要听说垃圾回收这个概念的。这不,对于已经写了多年Java代码的我来说,我还没有哪次经历说是需要使用垃圾回收方面的知识来解决问题的。但是,我依然督促自己花了几天时间系统性地(也比较浅显地)学习了Java垃圾回收机制。我认为学习Java垃圾回收机制至少可以得到以下几方面的好处:

  1. 对于系统调优有直接帮助

  2. 增加和同行聊天或者下一份工作面试时的谈资

  3. 在追求技术卓越上更进一步

 

(一)Java堆内存的分代管理

Java垃圾回收是需要消耗CPU和内存资源的,其速度随着内存的变大而减慢,这将严重影响系统的性能。同时,Java系统中存在着这么一种现象:大多数Java对象都是“短命”的。基于此,Java采用了分代的内存管理方式,并在不同的内存代中采用不同的垃圾回收算法,从而达到对内存更细粒度的管理,最大限度地减小垃圾回收对系统本身的影响。

 

 

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

 

 

由上图所示,Java的堆空间被分为了三个区域,分别是新生代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)。新创建出来的对象首先存放在新生代,经过新生代中多次垃圾回收(在Survivor 0和Survivor 1之间来回复制),存活下来的对象将被转移到老年代。新生代中垃圾回收很频繁,这样多数“短命”的对象将得到及时清理;又由于新生代内存空间通常不大,回收速度也相对较快。在老年代中,存放着从新生代中经历了多次垃圾回收后仍然存活的对象,这些对象相对较少,而老年代内存一般很大,并不容易塞满,因此老年代的垃圾回收频率要远远低于新生代,从而减少了对系统性能的影响。永久代中主要存放Java类本身的数据信息,当Java类不再被使用时,也会被垃圾回收掉。开发者们通常无法预测永久代的大小,导致程序经常出现 “java.lang.OutOfMemoryError: Permgen s