java虛擬機是通過垃圾回收的方式進(jìn)行內(nèi)存回收的,C/C++可以通過代碼控制內(nèi)存釋放,防止內(nèi)存泄露,設(shè)置不同的垃圾回收方式和參數(shù)都會影響垃圾回收的效果,而這對系統(tǒng)的穩(wěn)定性及單機的支撐能力方面。
jvm指令集里面沒有提供垃圾回收的釋放操作,所以不能直接釋放內(nèi)存,而要專門的垃圾回收器來完成垃圾回收的工作。
不同的垃圾回收器產(chǎn)品有不同的回收策略,先來看Oracle Hotspot JVM中內(nèi)存的對布局,如圖3.2

從上圖可以看出,有三大區(qū)域Young/Tenured/Perm,也就是我們經(jīng)常說的新生代/老年代/持久代。
一般來說,新的對象被分配到新生代(Young)的Eden區(qū),也有可能被直接分配到老年代(Perm),在進(jìn)行新生代垃圾回收的時候,Eden區(qū)存活的對象被復(fù)制到空的Survior區(qū),而下次新生代垃圾回收的時候,Eden區(qū)存活的對象和這個Survivor區(qū)中存活的對象被復(fù)制到另外一個Survivor區(qū),并且清空當(dāng)前的Survivor區(qū)。經(jīng)過多次的新生代的垃圾回收,還存活的對象被移到老年代,而老年代也會根據(jù)一定時間進(jìn)行呢垃圾回收。
在Hotspot中,針對新生代提供的GC方式:
串行GC:Serial Copying
并行GC:ParNew
并行回收GC:Parallel Scavenge
針對老年代有下面的GC方式:
串行GC:Serial MSC
并行MS GC:Parallel MSC
并行 GC:Compacting GC - Parallel Compacting
并發(fā)GC - CMS
在Sun的Java6 update14中,引入了Garbage First(G1)回收器,G1的目標(biāo)是取代CMS。
新聞熱點
疑難解答