Sun HotSpot JVM内存管理及垃圾收集
关键字:?jvm?,内存管理?,垃圾收集
?
转自:http://blog.csdn.net/watchnight/archive/2009/12/11/4987065.aspx
内存模型(内存池)
从上图可以看出,一个java进程主要分为“Java Heap”和“C Heap”两个部分。只有“Java Heap”是JVM的GC对象。
从J2SE 5.0开始,JVM启动时会默认选择按“server VM?”启动还是按“client VM?”,具体选择策略参照下面的连接。
Server-Class Machine Detection
启动方式选择好以后,开始选择GC方法,根据GC方法的不同,为每块内存池设置不同的默认值。关于GC方法的选择,参照下面的连接。
Garbage Collector Ergonomics
另外,JVM一共提供了4中GC方法,根据业务的不同,可以选择不同的GC方法。GC方法详细介绍,参见下面的连接。
Memory Management Whitepaper [pdf]
根据GC算法的不同,GC的名字,以及内存池的名字都不一样。
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)