JVM毕竟不是智能的,所以我们要根据实际的运行机器,实际业务等情况选择合适的参数去优化JVM下面我讲一些简单的参数列下来,这些参数的使用需要先理解JVM内存模型,垃圾回收机制.
- 当堆需要扩展的时内存不够会报 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 设置方法区最小大小
-XX:MaxPermsize 设置方法去最大大小
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.
关于JVM的Client和Server模式.JVM有Client和Server模式,在Client模式下,启动比较快,垃圾收集器默认使用Serial + Serial Old.在Server模式下,启动比较慢,默认使用Parallel Scanvenge + Serial Old.Client适用于桌面应用程序,用户线程执行时间长,用户体验好.Server适用于服务器端,吞吐量高.
JVM会根据机器的内存以及CPU数量来判断使用什么模式.通过java -version可以看到JVM使用什么模式.
当然也可以通过-client以及-server来指定JVM运行的模式.