首先,在进行JVM性能调优前,需要先了解一下JVM的体系结构,JVM由类加载器、Java堆、Java栈、方法区、本地方法栈、程序计数器、执行引擎等核心部分构成,如下图所示:

java jvm 参数优化 javajvm调优有几种方法_JVM

JVM调优主要有2个方面:堆大小设置、收集器选择

一:堆大小设置

JVM中堆大小的最大值受到三方面限制:系统可用物理内存限制、系统可用虚拟内存限制、系统数据模型(32位/64位)限制。在32位系统下,最大值范围一般限制在1.5~2G;在64位系统下,最大值一般不限制;典型的jvm堆大小设置有如下两种:

1、java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

-Xmx3550m:设置JVM最大可用内存为3550M。

-Xms3550m:设置JVM初始内存为3550m;此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmn2g:设置年轻代大小为2G;整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小,持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss128k:设置每个线程的堆栈大小;JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

2、java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-XX:NewRatio=4

设置年轻代(包括一个Eden区和两个Survivor区)与年老代的比值(除去持久代);设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:SurvivorRatio=4

设置年轻代中Eden区与Survivor区的大小比值;设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

-XX:MaxPermSize=16m

设置持久代大小为16m。

-XX:MaxTenuringThreshold=0

设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

二:一回收器选择

JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数;JDK5.0以后,JVM会根据当前系统配置进行判断。

1、并行收集器:吞吐量优先

并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等

2、并发收集器:响应时间优先

并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间,适用于应用服务器、电信领域等