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)

相关文章
相关标签/搜索