堆栈:
【堆】-Xms 初始堆大小,默认空余堆内存小于40%(MinHeapFreeRatio参数可以调整)时,JVM就会增大堆直到-Xmx的最大限制。-Xmx 最大堆大小,默认空余堆内存大于70%(MaxHeapFreeRatio参数可以调整)时,JVM会减少堆直到-Xms的最小限制。-Xmn 新生代大小: 1>新生代越大也就意味着会有更多的对象在minor GC期间被回收,如果设置的太大,则老年代就变小了,可能会频繁触发Full GC,甚至是OOM。 2>如果新生代设置的太小,则会导致minor GC更加频繁,进而会导致更多的对象直接进入老年代,当老年代已使用的空间到达一定比例时,会触发Full GC。 -XX:NewSize 设置新生代大小-XX:NewRatio 新生代(Eden+2个Survivor)与老年代的比值-XX:SurvivorRatio 设置Eden与1个Survivor的比值,默认为8,即 Eden : Survivor1 : Survivor2 = 8:1:1 1>Eden越大也就意味着发生minor GC的频率越低,如果Eden设置的太大,造成Survivor太小,则会导致要回收的对象在minor GC后就直接进入老年代,从而更频繁地触发Full GC。 【栈】-Xss 每个线程的栈大小: 1>在相同物理内存下:减小这个值能生成更多的线程,但是操作系统对一个进程内的线程数是有限制的,不能无限生成(网上说是3k-5k左右,没有做过测试)。 2>一般比较小的系统,如果栈不是很深,则128k就够用了,较大的系统则应设置为256k。 3>jdk5之后,每个线程堆栈大小默认为1M。 【永久代】 -XX:PermSize 设置永久代初始值-XX:MaxPermSize 设置持久代最大值【其它】-XX:+TraceClassLoading 跟踪类加载和卸载的信息,一般我们在排查内存泄露、jar包版本冲突等问题时会添加这个参数。-XX:LargePageSizeInBytes=128 设置内存页的大小-XX:MaxTenuringThreshold GC最大年龄 1>如果设置为0,则新生代对象不经过Survivor区,直接进入老年代。对于老年代中对象比较多的应用,可以提高效率。 2>如果设置为一个较大的值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象在新生代的存活时间,增加对象在新生代被回收的概率,该参数只有在串行GC时才有效。
GC收集器:
ParNew收集器: -XX:+UseParNewGC 设置新生代的收集器为ParNew收集器(并行收集器)。该设置默认是关闭的,打开该开关后,jvm会使用 ParNew + Serial Old 来进行gc。 -XX:ParallelGCThreads 并行收集器的线程数,此值建议设置为处理器的个数。CMS收集器: -XX:+UseConcMarkSweepGC 设置老年代的收集器为CMS收集器。 -XX:+CMSParallelRemarkEnabled 开启并行remark,以减少remark时程序暂停的时间。 -XX:CMSInitiatingOccupancyFraction=70 当老年代的空间被占用70%后,CMS收集器开始gc。 1>JVM会收集对象分配和释放的运行时数据,并且通过分析这些数据来决定什么时候应该进行一次gc(即:启动一次CMS垃圾收集器)。 2>为了引导这一过程,JVM会在启动CMS收集器前进行一些线索查找,该线索由-XX:CMSInitiatingOccupancyFraction来设置,该值表示老年代的使用率。 -XX:+UseCMSInitiatingOccupancyOnly 命令JVM不要根据运行时收集的数据来判断什么时候开始gc,而是根据CMSInitiatingOccupancyFraction的值来判断是否进行CMS收集。注意:一般不会打开该开关。 -XX:+UseCMSCompactAtFullCollection CMS收集器在gc时,允许对老年代进行压缩,解决因标记-清除算法导致的内存碎片的问题。 -XX:CMSFullGCsBeforeCompaction=0 CMS收集器gc多少次后进行内存压缩(整理),由于CMS收集器使用的是标记-清除算法,所以CMS在gc后会产生内存碎片,使得运行效率降低。 -XX:+CMSClassUnloadingEnabled 开启CMS收集器对永久代的gc(默认不会对永久代进行gc)。 -XX:CMSInitiatingPermOccupancyFraction 设置永久代使用到达多少比率时触发CMS收集器的gc -XX:+DisableExplicitGC 禁止System.gc(),避免因开发人员不恰当地调用System.gc()方法对系统性能造成的不良的影响。 -Xnoclassgc 禁用类垃圾回收功能,也就避免了同一个类的加载、卸载、(再次用到该类时)再加载的操作,性能会高一点。 1>虚拟机加载类的过程中包含了IO和内存分配等操作,故JVM在加载类时会对性能产生一定的影响。 -XX:+UseFastAccessorMethods 优化原始类型的getter方法的性能,默认开启。 -XX:+PrintClassHistogram 遇到Ctrl+Break中断,打印类实例的柱状信息,与jmap -histo功能相同 -XX:SoftRefLRUPolicyMSPerMB=0 设置每兆堆空闲空间中软引用(SoftReference)的存活时间,默认值为1(秒)。 1>softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap. 2>SoftReference是在gc时才被回收,故SoftReference实际的存活时间可能比这个设定的值要大。 3>一般情况下,建议设置为0。
辅助信息:
-XX:+PrintGCDetails 打印GC的详细信息-XX:+PrintGCTimeStamps 打印GC的时间戳-XX:+PrintHeapAtGC 打印GC前后堆栈的详细信息-Xloggc: 设置gc的log日志。eg:-Xloggc:$CATALINA_BASE/logs/gc.log
补充: -XX:CMSInitiatingOccupancyFraction与-Xmn之间的关系:
内存分配担保失败(promontion faild)的原因: 1)Minor GC时,将eden和survivor from中存活的对象复制到survivor to中的时候,如果survivor to容纳不下这些对象,那么这些对象将晋升到老年代, 2)此时,如果老年代中剩余的空间也无法容纳下这些对象,那么就会导致内存分配担保失败(promontion faild),进而引发了full gc。 结论:当新生代与老年代满足 eden + survivor from <= 老年代剩余的空间 关系时,promontion faild就不会发生。 即:eden + survivor from <= (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100) 由方程组: Eden / Survivor=SurvivorRatio Eden + 2Survivor=Xmn Survivor * SurvivorRatio + 2Survivor = Xmn ===> Survivor = Xmn/(SurvivorRatio+2) 可得出: Eden + Survivor = Xmn-Survivor = Xmn - Xmn/(SurvivorRatio+2) 即:Xmn - Xmn/(SurvivorRatio+2) <= (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100) 简化: CMSInitiatingOccupancyFraction <= (1 - (Xmn-Xmn/(SurvivorRatio+2))/(Xmx-Xmn)) * 100 eg:如果 -Xms8G -Xmx8G -Xmn3G -XX:SurvivorRatio=8,则 CMSInitiatingOccupancyFraction <= (1 - (3-3/(8+2))/(8-3))) = 46% CMSInitiatingOccupancyFraction低于70% 需要调整xmn或SurvivorRatior值。
===================================================================================
网上某大牛的配置,据称可以支持每天几百万的pv。
JAVA_OPTS="-Dresin.home=$SERVER_ROOT-server-Xms6000M-Xmx6000M-Xmn500M-XX:PermSize=500M-XX:MaxPermSize=500M-XX:SurvivorRatio=65536-XX:MaxTenuringThreshold=0-Xnoclassgc-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+UseCMSCompactAtFullCollection-XX:CMSFullGCsBeforeCompaction=0-XX:+CMSClassUnloadingEnabled-XX:-CMSParallelRemarkEnabled-XX:CMSInitiatingOccupancyFraction=90-XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassHistogram-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-Xloggc:log/gc.log" 说明: 1)-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 表示在新生代中去掉了Survivor,即新生代中只有Eden
===================================================================================