一个性能较好的web服务器jvm参数配置:
-server //服务器模式 -Xmx2g //JVM最大允许分配的堆内存,按需分配 -Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JVM重新分配内存。 -Xmn256m //年轻代内存大小,整个JVM内存=年轻代 + 年老代 + 持久代 -XX:PermSize=128m //持久代内存大小 -Xss256k //设置每个线程的堆栈大小 -XX:+DisableExplicitGC //忽略手动调用GC, System.gc()的调用就会变成一个空调用,完全不触发GC -XX:+UseConcMarkSweepGC //并发标记清除(CMS)收集器 -XX:+CMSParallelRemarkEnabled //降低标记停顿 -XX:+UseCMSCompactAtFullCollection //在FULL GC的时候对年老代的压缩 -XX:LargePageSizeInBytes=128m //内存页的大小 -XX:+UseFastAccessorMethods //原始类型的快速优化 -XX:+UseCMSInitiatingOccupancyOnly //使用手动定义初始化定义开始CMS收集 -XX:CMSInitiatingOccupancyFraction=70 //使用cms作为垃圾回收使用70%后开始CMS收集
-Xmn和-Xmx之比大概是1:9,如果把新生代内存设置得太大会导致young gc时间较长
一个好的Web系统应该是每次http请求申请内存都能在young gc回收掉,full gc永不发生,当然这是最理想的情况
xmn的值应该是保证够用(够http并发请求之用)的前提下设置得尽量小
web服务器和游戏服务器的配置思路不太一样,最重要的区别是对游戏服务器的xmn即年轻代设置比较大,和Xmx大概1:3的关系,因为游戏服务器一般是长连接,在保持一定的并发量后需要较大的年轻代堆内存,如果设置得大小了会经常引发young gc
由上图可以看出jvm堆内存的分类情况,JVM内存被分成多个独立的部分。
广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generation)。
仅需要使用JVM开关就可以在我们的应用里启用垃圾回收策略。
Serial GC(-XX:+UseSerialGC):Serial GC使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收,即Minor GC和Major GC。Serial GC在client模式(客户端模式)很有用,比如在简单的独立应用和CPU配置较低的机器。这个模式对占有内存较少的应用很管用。
Parallel GC(-XX:+UseParallelGC):除了会产生N个线程来进行年轻代的垃圾收集外,Parallel GC和Serial GC几乎一样。这里的N是系统CPU的核数。我们可以使用 -XX:ParallelGCThreads=n 这个JVM选项来控制线程数量。并行垃圾收集器也叫throughput收集器。因为它使用了多CPU加快垃圾回收性能。Parallel GC在进行年老代垃圾收集时使用单线程。
Parallel Old GC(-XX:+UseParallelOldGC):和Parallel GC一样。不同之处,Parallel Old GC在年轻代垃圾收集和年老代垃圾回收时都使用多线程收集。
并发标记清除(CMS)收集器(-XX:+UseConcMarkSweepGC):CMS收集器也被称为短暂停顿并发收集器。它是对年老代进行垃圾收集的。CMS收集器通过多线程并发进行垃圾回收,尽量减少垃圾收集造成的停顿。CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器一样。这个垃圾收集器适用于不能忍受长时间停顿要求快速响应的应用。可使用 -XX:ParallelCMSThreads=n JVM选项来限制CMS收集器的线程数量。
G1垃圾收集器(-XX:+UseG1GC) G1(Garbage First):垃圾收集器是在Java 7后才可以使用的特性,它的长远目标时代替CMS收集器。G1收集器是一个并行的、并发的和增量式压缩短暂停顿的垃圾收集器。G1收集器和其他的收集器运行方式不一样,不区分年轻代和年老代空间。它把堆空间划分为多个大小相等的区域。当进行垃圾收集时,它会优先收集存活对象较少的区域,因此叫“Garbage First”。