Sun HotSpot JVM內(nèi)存管理及垃圾收集
轉(zhuǎn)自:http://blog.csdn.net/watchnight/archive/2009/12/11/4987065.aspx
內(nèi)存模型(內(nèi)存池)
從上圖可以看出,一個(gè)java進(jìn)程主要分為“Java Heap”和“C Heap”兩個(gè)部分。只有“Java Heap”是JVM的GC對(duì)象。
從J2SE 5.0開(kāi)始,JVM啟動(dòng)時(shí)會(huì)默認(rèn)選擇按“server VM ”啟動(dòng)還是按“client VM ”,具體選擇策略參照下面的連接。
Server-Class Machine Detection
啟動(dòng)方式選擇好以后,開(kāi)始選擇GC方法,根據(jù)GC方法的不同,為每塊內(nèi)存池設(shè)置不同的默認(rèn)值。關(guān)于GC方法的選擇,參照下面的連接。
另外,JVM一共提供了4中GC方法,根據(jù)業(yè)務(wù)的不同,可以選擇不同的GC方法。GC方法詳細(xì)介紹,參見(jiàn)下面的連接。
Memory Management Whitepaper [pdf]
根據(jù)GC算法的不同,GC的名字,以及內(nèi)存池的名字都不一樣。
J2SDK 5提供了一些MXBean,通過(guò)這些MXBean可以取得具體的名字。
如:java.lang.management.GarbageCollectorMXBean和java.lang.management.MemoryMXBean
(1)-XX:+UseConcMarkSweepGC
GC名:
ParNew
ConcurrentMarkSweep
內(nèi)存池名:
CMS Perm Gen
Par Eden Space
Par Survivor Space
Code Cache
CMS Old Gen
(2)-XX:+UseParallelGC
GC名:
PS Scavenge
PS MarkSweep
內(nèi)存池名:
PS Survivor Space
PS Perm Gen
PS Old Gen
PS Eden Space
Code Cache
(3)-XX:+UseParallelOldGC
GC名:
PS Scavenge
PS MarkSweep
內(nèi)存池名:
PS Survivor Space
PS Perm Gen
PS Old Gen
PS Eden Space
Code Cache
(4)-XX:+UseSerialGC
GC名:
Copy
MarkSweepCompact
內(nèi)存池名:
Survivor Space
Perm Gen
Tenured Gen
Eden Space
Code Cache
關(guān)于"Code Cache"的說(shuō)明,資料比較少,下面的連接中,只有一句介紹,對(duì)普通程序員來(lái)說(shuō)也夠用了。
http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
我們可以看到,每種算法,GC都是有兩個(gè),一個(gè)是minor collection,一個(gè)是major collection(也叫FullGC)。
JVM還提供了一個(gè)System.gc(),讓程序員主動(dòng)GC,System.gc()是minor還是major?答案是major。參見(jiàn)下面的連接。
http://java.sun.com/docs/hotspot/gc1.4.2/faq.html
從 Java SE 6 Update 14開(kāi)始,又增加了一個(gè)名叫G1的垃圾收集算法。跟前面的4種內(nèi)存管理模式完全不一樣。
具體沒(méi)有研究過(guò),算法詳細(xì)參見(jiàn)下面的連接。
http://java.sun.com/javase/technologies/hotspot/gc/g1_intro.jsp
JVM中的Object是如何分配,如何收集的?什么時(shí)候使用minor什么時(shí)候使用major?什么時(shí)候發(fā)生OutOfMemoryException?
關(guān)于這個(gè)問(wèn)題,HP網(wǎng)站上有一篇詳細(xì)介紹GC的PPT,值得一看。
posted on 2011-12-25 16:32 lysu 閱讀(1071) 評(píng)論(0) 編輯 收藏