Sun HotSpot JVM內存管理及垃圾收集

轉自:http://blog.csdn.net/watchnight/archive/2009/12/11/4987065.aspxhtml

內存模型(內存池)java

從上圖能夠看出,一個java進程主要分爲「Java Heap」和「C Heap」兩個部分。只有「Java Heap」是JVM的GC對象。程序員

從J2SE 5.0開始,JVM啓動時會默認選擇按「server VM 」啓動仍是按「client VM 」,具體選擇策略參照下面的鏈接。算法

Server-Class Machine Detectionjsp

啓動方式選擇好之後,開始選擇GC方法,根據GC方法的不一樣,爲每塊內存池設置不一樣的默認值。關於GC方法的選擇,參照下面的鏈接。ide

Garbage Collector Ergonomics網站

另外,JVM一共提供了4中GC方法,根據業務的不一樣,能夠選擇不一樣的GC方法。GC方法詳細介紹,參見下面的鏈接。ui

Memory Management Whitepaper [pdf]spa

根據GC算法的不一樣,GC的名字,以及內存池的名字都不同。.net

J2SDK 5提供了一些MXBean,經過這些MXBean能夠取得具體的名字。

如:java.lang.management.GarbageCollectorMXBean和java.lang.management.MemoryMXBean

(1)-XX:+UseConcMarkSweepGC

 GC名:

   ParNew

   ConcurrentMarkSweep

 內存池名:

   CMS Perm Gen

   Par Eden Space

   Par Survivor Space

   Code Cache

   CMS Old Gen

(2)-XX:+UseParallelGC

 GC名:

   PS Scavenge

   PS MarkSweep

 內存池名:

   PS Survivor Space

   PS Perm Gen

   PS Old Gen

   PS Eden Space

   Code Cache

(3)-XX:+UseParallelOldGC

 GC名:

   PS Scavenge

   PS MarkSweep

 內存池名:

   PS Survivor Space

   PS Perm Gen

   PS Old Gen

   PS Eden Space

   Code Cache

(4)-XX:+UseSerialGC

 GC名:

   Copy

   MarkSweepCompact

 內存池名:

   Survivor Space

   Perm Gen

   Tenured Gen

   Eden Space

   Code Cache

關於"Code Cache"的說明,資料比較少,下面的鏈接中,只有一句介紹,對普通程序員來講也夠用了。

http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html

咱們能夠看到,每種算法,GC都是有兩個,一個是minor collection,一個是major collection(也叫FullGC)。

JVM還提供了一個System.gc(),讓程序員主動GC,System.gc()是minor仍是major?答案是major。參見下面的鏈接。

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

從 Java SE 6 Update 14開始,又增長了一個名叫G1的垃圾收集算法。跟前面的4種內存管理模式徹底不同。

具體沒有研究過,算法詳細參見下面的鏈接。

http://java.sun.com/javase/technologies/hotspot/gc/g1_intro.jsp

JVM中的Object是如何分配,如何收集的?何時使用minor何時使用major?何時發生OutOfMemoryException?

關於這個問題,HP網站上有一篇詳細介紹GC的PPT,值得一看。

Memory Management and Garbage Collection (PDF, 1.4MB)

相關文章
相關標籤/搜索