GC参数

堆 新生代  (伊甸园区  幸存区(2个幸存区使用的是复制算法,也叫from,to区)) 老年代

一般初始化的对象先到新生代,除非对象很大会直接到老年代,在gc新生代之后幸存的对象会到幸存区。经过多次gc之后依然存活的对象会被移到老年区长期存在。



 

-XX:+UserSerialGc 最古老最稳当

新生代、老年代使用串行回收

新生代使用复制算法,老年代使用标记-压缩算法。



 

-XX:UserParNewGC

新生代并行,老年代串行。

Parallel收集器,串行收集器在新生代和老年代的并行化

新生代复制算法

老年代标记压缩算法

-XX:+UserParallelGC 使用Parallel收集器(新生代并行,老年代串行)

-XX:+UserParalleOldGC使用Parallel收集器(新生代并行,老年代并行)

-XX:MaxGCPauseMills最大停顿时间,单位毫秒。GC尽力保证回收时间不超过设定值

-XX:GCTimeRatio 0-100的取值范围,垃圾收集时间占总时间的比。默认99,即最大允许1%时间做GC

上面两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优。

 

 

CMS收集器 Concurrent Mark Sweep 并发标记清除,主要特点是和用户线程一起执行。上图是主要工作原理。因为和用户线程一起运行,不能再空间快man的时候在清理,-XX:CMSInitiatingOccupancyFraction设置出发GC的阈值,如果不幸内存预留空间不过,就会引起concurrent mode failure。

标记清除后内存不一定是连续的(因为是和用户线程是并发执行,如果移动用户内存地址,会因为用户线程找不到内存),标记压缩后内存是连续的。

三种内存溢出异常介绍

1. OutOfMemoryError: Java heap space  堆溢出

内存溢出主要存在问题就是出现在这个情况中。当在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

 2. OutOfMemoryError: PermGen space   非堆溢出(永久保存区域溢出)

这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

3. OutOfMemoryError: unable to create new native thread.   无法创建新的线程

这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。

猜你喜欢

转载自peng4602.iteye.com/blog/2366932