在生产环境下对Java虚拟机JVM进行参数调优是必不可少的。作为普通的开发人员,如果对JVM的参数优化有一定的了解,即使是从知识体系的完整性来考虑也是大有裨益的。尴尬另外,了解JVM的运行原理也有助于编写性能良好的程序,而不是让代码成为服务器CPU和内存的杀手。

 

【Windows平台的参数调优】

       通常我们都在Windows系统下面进行软件开发工作,因此在Windows平台下面的JVM参数调优也是有必要了解的。有时候开发大规模的商业系统,即使是在开发环境也不得不进行JVM参数调优,否则系统根本跑不起来。选用MyEclipse作为开发工具,集成Tomcat作为web容器,选择“Window -> Preferences”菜单:依次选择左侧的导航菜单“MyEclipse -> Servers -> Tomcat -> Tomcat 6.x -> JDK”,微笑或者直接在文本框中输入“tomcat”进行筛选:如下图所示 


        在VM Arguments文本框中输入需要设置的JVM参数,然后在MyEclipse中启动Tomcat服务器。 

Shell代码   收藏代码
  1. -Xms512m  
  2. -Xmx512m  
  3. -XX:PermSize=256m  
  4. -XX:MaxPermSize=256m  

      为了验证Tomcat是否成功启动,打开命令行输入命令: 

Shell代码   收藏代码
  1. jps  

       命令提示符回显如下内容,其中Bootstrap即为Tomcat服务器进程,前面对应的8184即为Tomcat进程的进程号PID:天真 

Shell代码   收藏代码
  1. 6540 Jps  
  2. 1176  
  3. 8184 Bootstrap  

      然后这个时候我们仍然不知道设置的VM Arguments是否真的在Tomcat启动时成功加载,为此输入命令 

Shell代码   收藏代码
  1. jps -v  

     提示符回显如下内容,可以看到我们设置的VM Arguments参数确实是生效了的。


 

【Linux平台的参数调优】

        通常情况下,生产环境的Tomcat服务器都部署在Linux系统下面,因此简要介绍Linux系统下面的有关设置,进入Tomcat的\bin目录: 

Shell代码   收藏代码
  1. cd /usr/local/tomcat/bin  

       打开需要编辑的shell文件:惊讶 

Shell代码   收藏代码
  1. vi catalina.sh  

      找到“# ----- Execute The Requested Command -----”行,在下面添加如下内容:大笑 

Shell代码   收藏代码
  1. JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=64m"  

     然后保存退出即可,重启Tomcat服务器之后,可通过进程查看命令查看Tomcat启动时所使用的VM Arguments参数:微笑 

Shell代码   收藏代码
  1. ps -ef | grep tomcat  

    可以看到Tomcat启动时所使用的VM Arguments参数:


 
 【JVM优化参数说明】

       在生产环境下可以设置的JVM参数远不止上面提到的这些。下面简要介绍一些常见的VM Arguments参数,理解并正确使用这些参数需要对JVM原理、堆内存结构、垃圾回收原理有比较深刻的认识,这里抛砖引玉了啦。大笑 

Shell代码   收藏代码
  1. -server  

      默认情况下JVM运行在client模式,通过设置该参数JVM将运行在server模式。 

Shell代码   收藏代码
  1. -Xms512m -Xmx512m  

     设置Java堆内存的最大、最小值,通常设为一致以避免进行垃圾回收之后重新调整堆的大小。 

Shell代码   收藏代码
  1. -XX:PermSize=256m -XX:MaxPermSize=256m  

    设置方法区的最大、最小值,如果使用Spring、Hibernate等框架技术,在运行时会生成大量 的动态代理类,有可能导致永久代内存溢出。 

Shell代码   收藏代码
  1. -Xss1m  

     设置线程栈的大小,可以结合实际情况设置的小一点,以运行创建更多的线程数目。 

Shell代码   收藏代码
  1. -XX:NewRatio=3  

     设置Java堆内存新生代、老年代的比例为1:3 

Shell代码   收藏代码
  1. -XX:SurvivorRatio=8  

     新生代内存分配比例为Eden:From Survivor:To Survivor=8:1:1 

Shell代码   收藏代码
  1. -XX:+UseParNewGC  

    新生代使用并行的ParNew收集器。 

Shell代码   收藏代码
  1. -XX:ParallelGCThreads=2  

    并行收集的GC线程数目为2、和CPU内核数目一致。 

Shell代码   收藏代码
  1. -XX:+UseConcMarkSweepGC  

    老年代使用CMS收集器。 

Shell代码   收藏代码
  1. -XX:CMSInitiatingOccupancyFraction=70  

    老年代在堆内存使用率为70%开始进行Full GC

Shell代码   收藏代码
  1. -XX:+CMSParallelRemarkEnabled  

    老年代通过并行标记减少因为标记而导致的停顿时间

Shell代码   收藏代码
  1. -XX:+UseCMSCompactAtFullCollection  

    在进行Full GC时启用内存碎片整理

Shell代码   收藏代码
  1. -XX:CMSFullGCsBeforeCompaction=2  

    在整理内存碎片之前进行的Full GC的次数为2

Shell代码   收藏代码
  1. -XX:+CMSClassUnloadingEnabled  

   方法区允许进行类的卸载,防止方法区内存溢出

Shell代码   收藏代码
  1. -XX:+CMSPermGenSweepingEnabled  

   方法区的垃圾回收同时添加该参数,仅JDK1.6之前需要

Shell代码   收藏代码
  1. -XX:SoftRefLRUPolicyMSPerMB=0  

    设置软引用对象的回收策略,在堆内存紧张时立即回收所有的软引用对象

Shell代码   收藏代码
  1. -XX:MaxTenuringThreshold=5  

    新生代中的对象如果Age为5将被移动到老年代

Shell代码   收藏代码
  1. -XX:PretenureSizeThreshold=3145728  

    大于3MB(3145728 byte)的对象直接存放在老年代

Shell代码   收藏代码
  1. -XX:+DisableExplicitGC  

   禁用Syste.gc()代码进行Full GC,注意:有潜在的直接内存溢出可能惊讶 

 

====================================

限于篇幅,无法对每个参数进行一一详解,理解每个VM Arguments参数的设置都需要对JVM原理的相关知识烂熟于心,犹豫并且还有更多的参数需要应用在生产环境,诸君努力!吐舌头

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐