JVM收集器
串行收集器
无需多线程交互,但无法发挥出多处理器的优势,适合单处理器的机器以及数据量较小的情况。
使用-XX:+UseSerialGC打开
并行收集器
jdk5引入,用于对年轻代进行回收,一般用在多线程处理器上。
使用-XX:+UseParallerGC打开
jdk6之后可对老年代进行回收,若不打开默认是单线程,
使用-XX:+UseParallerOldGC打开
配置
回收线程数:
使用-XX:ParallerGCThreads=来设置回收的线程数,一般与CPU一致。
最大垃圾回收暂停:
使用-XX:MaxGCPauseMillis=(毫秒)设置垃圾回收时的最大暂停时间,设置后会导致一些其他的参数自动调整来满足它,如:可能会减少吞吐量
吞吐量:
使用-XX:GCTimeRatio=来设置非垃圾回收时间与垃圾回收时间之比,如N为19时,垃圾时间占总时间的1/(19+1)=5%,及垃圾回收的时间为总时间的5%
并发收集器
可以保证并发进行垃圾回收(应用基本不暂停),适合对响应时间要求较高的中大型规模应用。
使用:-XX:+UseConMarkSweepGC打开
主要用来减少老年代的暂停时间。
当初次标记(单线程)以及重新标记(多线程、暂停相对初次较久)的时候会有暂停。
在单CPU主机上也可以使用-XX:+CMSIncrementalMode打开增量模式来减少暂停时间
并发收集器既用处理器来换取时间,在一台处理器N个的系统上,一般有[1,n/4]个处理器用于垃圾回收,可使用-XX:+ParallerGCThreads=来设置处理器个数。
一些概念
浮动垃圾:
因并发回收器的垃圾回收与应用是同时进行的,在垃圾回收的时候应用也会产生垃圾,这些浮动垃圾一般要预留20%的空间来处理。
Concurrent Mode Failure:
因并发回收器的垃圾回收与应用是同时进行的,若在期间产生的垃圾使堆空间满了,此时会暂停所有应用进行垃圾回收
JVM常用配置
比较经典的有
-Xmx3550m 最大可用内存
-Xms3550m 初始内存
-Xmn2g 年轻代大小2G
-Xss128k 每个线程的堆栈大小为128k,减小可生成更多线程
再有一些常用的如
-XX:NewRatio = 4 年轻代(单词New)与老年代之比为1:4
-XX:SurvivorRatio = 4 Survivor区(单词Survivor)与Eden区之比为1:1:4(两个Survivor)
-XX:MaxPermSize = 16m 持久代的大小为16m
-XX:MaxTenuringThreshold=0 年轻代垃圾回收的最大年龄,如果老年代较多的应用可使用