JVM参数优化

cymt 9年前

JVM毕竟不是智能的,所以我们要根据实际的运行机器,实际业务等情况选择合适的参数去优化JVM下面我讲一些简单的参数列下来,这些参数的使用需要先理解JVM内存模型,垃圾回收机制.

  1. 当堆需要扩展的时内存不够会报  OutOfMemeryError: Heap(堆内存溢出) ,这时可能设置堆大小参数:

            -Xms=10M  设置堆的最小大小

            -Xmx=20M   设置堆的最大大小

            -Xmn=3M   设置年轻代的大小,如果设置太大会导致老年代太小,所以官方推荐为整个堆的3/8大小

            -XX:HeapDumpPath=E:\Java\dump   设置堆转储文件的地址

            -XX:+HeapDumpOnOutOfMemoryError   当发生堆内存溢出的时候生成堆转储文件,可以通过分析堆转储文件来找到溢出的原因

    2.在经常动态生成大量Class的应用中,如使用Cglib增强,动态语言,大量Jsp文件 时,可能报OutOfMemeryError:PerGen space(方法区溢出).

            -XX:PermSize:10M    设置方法区最小大小   //红薯告诉我1.8的JDK已经把这个参数废弃了

            -XX:MaxPermsize        设置方法去最大大小    //红薯告诉我1.8的JDK已经把这个参数废弃了

    3.垃圾回收器设置:

        -XX:UseSerialGC    新生代使用Serial收集器,老年代使用Serial Old 收集器 .当JVM运行在Client模式下,默认打开.

        -XX:UseParNewGC    新生代使用ParNew收集器,老年代使用Serial Old 收集器

        -XX:UseConcMarkSweepGC  新生代使用ParNew收集器,老年代使用CMS,Serial Old,当老年代使用CMS出现Concurrent Mode Failure的时候才使用Serial Old收集器

        -XX:ParallelGCThreads  由于ParNew收集器是多线程的,默认线程数就是内核数目,可以通过这个指定垃圾收集时线程数目

        -XX:UseParallelGC     新生代使用Parallel Scavenge收集器,老年代使用Serial Old收集器,JVM运行在Server模式下,默认开启.

        -XX:UseParallelGC   新生代使用Parallel Scavenge收集器,老年代使用Parallel Old收集器

        -XX:Maxtenuing Threshold      当新手代对象经过指定的次数就能进入老年代,默认为15.

        -XX:printGCDetails  打印垃圾收集的日志



关于JVM的Client和Server模式.JVM有Client和Server模式,在Client模式下,启动比较快,垃圾 收集器默认使用Serial + Serial Old.在Server模式下,启动比较慢,默认使用Parallel Scanvenge + Serial Old.Client适用于桌面应用程序,用户线程执行时间长,用户体验好.Server适用于服务器端,吞吐量高.

JVM会根据机器的内存以及CPU数量来判断使用什么模式.通过java -version可以看到JVM使用什么模式.

JVM参数优化

当然也可以通过-client以及-server来指定JVM运行的模式.