堆栈:算法
【堆】 -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收集器:jvm
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
===================================================================================线程