首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

探究JVM跟GC(转)

2012-12-26 
探究JVM和GC(转)图2:GC参数?堆设置?-Xms :初始堆大小-Xmx :最大堆大小-XX:NewSizen :设置年轻代大小-XX:N

探究JVM和GC(转)

图2:GC参数

?堆设置?
-Xms :初始堆大小
-Xmx :最大堆大小
-XX:NewSize=n :设置年轻代大小
-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n :设置持久代大小
收集器设置
-XX:+UseSerialGC :设置串行收集器
-XX:+UseParallelGC :设置并行收集器
-XX:+UseParalledlOldGC :设置并行年老代收集器
-XX:+UseConcMarkSweepGC :设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间
-XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode :设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n :设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

6 例子:Heap size 设置

场景:在JAVA_HOME下demo/jfc/SwingSet2/目录下执行下面的命令:

??? java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar

系统输出:

Exception in thread “Image Fetcher 0″ java.lang.OutOfMemoryError: Java heap space

Exception in thread “Image Fetcher 3″ java.lang.OutOfMemoryError: Java heap space

Exception in thread “Image Fetcher 1″ java.lang.OutOfMemoryError: Java heap space

Exception in thread “Image Fetcher 2” java.lang.OutOfMemoryError: Java heap space

调优:将-Xms和-Xmx选项设置为32m,而-Xmn为1/4的-Xmx值。

结果:执行java -jar –Xmn8m –Xms32m -Xmx32m SwingSet2.jar,系统正常运行。

7 JVM? Runtime Data Area(运行时数据区):

?探究JVM跟GC(转)

图3:JVM运行时数据区(一)

Heap: JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。

Method area: JVM只有一个为所有的线程所共享的方法区。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码。

Java Stacks: 每个JVM线程拥有一个私有的栈。

Pc registers: JVM可以同时支持运行多个线程,因此每个线程需要各自的PC(program?counter)寄存器。

Native method stacks: 保存native方法进入区域的地址?。

?探究JVM跟GC(转)

图4:JVM运行时数据区(二)

Heap和Method area被所有线程共享,其生存期和JVM的生存期相同;Java Stacks、Pc registers、Native method stacks被每个线程独自拥有,其生存期和线程的生存期相同。

8. 常见的内存泄露错误

很多开发人员都碰到过java.lang.OutOfMemoryError的错误。这种错误又分两种:java.lang.OutOfMemoryError: Java heap space和java.lang.OutOfMemoryError: PermGen space。引起这种错误的原因可能是程序问题,也可能是是JVM参数配置问题引起的。若是参数问题,其中前者可以同过配置-Xms和-Xmx参数来设置,而后者可以通过配置 -XX:PermSize和-XX:MaxPermSize来设置。???????????????????????

9 参考资料:

1.? A brief history of garbage collection –

http://www-128.ibm.com/developerworks/java/library/j-jtp10283/

2.? Garbage collection in the HotSpot JVM –

http://www-128.ibm.com/developerworks/java/library/j-jtp11253/

3.? Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

4.? Diagnosing a GC problem –

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

热点排行