朝花夕拾

A Development Engineer, a Life Liver, a Hope Holder

内存模型

从上图可知,jvm堆内存分为年轻代和老年代两大部分;年轻代又可分为eden区,form区和to区。

垃圾回收机制

  1. 新对象new出来时,都在eden区。当eden区不够时,触发minor GC
  2. minor GC释放eden区可以被释放的对象,并将不能释放的对象copy到to Survivor区,对象年龄增加。
  3. minor GC释放from Survivor区中可被释放的对象,将不能被释放的对象放入to Survivor区。对象年龄增加。
  4. 将to Survivor区中年龄较大的对象copy到old区
  5. 如果to Survivor区空间不足,将多余对象copy到old区
  6. old区不足,触发full GC

说明:

Survivor区是对称的,from和to的角色不停互换,但是运行期间,保证一个Survivor是空的。

调优方案

选择合适的Collector
  1. Serial 串行收集器,单线程收集,运行期间会暂停程序
  2. 并行收集器,与串行比较,并行收集使用了多线程,运行期间也会暂停程序,但是效率较高
  3. CMS(concurrent mark-sweep)程序运行期间有单独线程进行标记操作,执行GC的时候,多线程同时开始工作。因为在程序运行期间已经做好了标记处理,所以收集的时候就会更加迅速。效率更高

可以看出,单线程收集器应该是效率最差的,多线程收集器比单线程会有更好的收集效果。
CMS的好处是拥有最短的程序暂停时间,但是会损耗一定的程序运行效率,应该程序运行期间虚拟机需要一部分线程做对象标记操作。

参数调优:

-xms -xmx 最大堆内存,初始堆内存
本地物理内存 = 堆内存(系统预留内存)+永久带内存(64m)+系统保留内存
最大堆内存和初始堆内存最好一样,这样可以避免堆内存的自动扩展

增大堆内存,可以减少full GC的发生频率,介绍minor GC的发生频率,增加系统的吞吐量。
年轻代的大小关系到老年代的大小,老年代太小,容易产生full GC。所以,年轻代不易太大。

参考文章:http://www.360doc.com/content/12/0113/08/1073512_179088229.shtml