java垃圾回收和堆内存布局
java虚拟机是通过垃圾回收的方式进行内存回收的,C/C++可以通过代码控制内存释放,防止内存泄露,设置不同的垃圾回收方式和参数都会影响垃圾回收的效果,而这对系统的稳定性及单机的支撑能力方面。
jvm指令集里面没有提供垃圾回收的释放操作,所以不能直接释放内存,而要专门的垃圾回收器来完成垃圾回收的工作。
不同的垃圾回收器产品有不同的回收策略,先来看Oracle Hotspot JVM中内存的对布局,如图3.2
从上图可以看出,有三大区域Young/Tenured/Perm,也就是我们经常说的新生代/老年代/持久代。
一般来说,新的对象被分配到新生代(Young)的Eden区,也有可能被直接分配到老年代(Perm),在进行新生代垃圾回收的时候,Eden区存活的对象被复制到空的Survior区,而下次新生代垃圾回收的时候,Eden区存活的对象和这个Survivor区中存活的对象被复制到另外一个Survivor区,并且清空当前的Survivor区。经过多次的新生代的垃圾回收,还存活的对象被移到老年代,而老年代也会根据一定时间进行呢垃圾回收。
在Hotspot中,针对新生代提供的GC方式:
串行GC:Serial Copying
并行GC:ParNew
并行回收GC:Parallel Scavenge
针对老年代有下面的GC方式:
串行GC:Serial MSC
并行MS GC:Parallel MSC
并行 GC:Compacting GC - Parallel Compacting
并发GC - CMS
在Sun的Java6 update14中,引入了Garbage First(G1)回收器,G1的目标是取代CMS。