JVM理论与实践【JVM参数调优】
在生产环境下对Java虚拟机JVM进行参数调优是必不可少的。作为普通的开发人员,如果对JVM的参数优化有一定的了解,即使是从知识体系的完整性来考虑也是大有裨益的。另外,了解JVM的运行原理也有助于编写性能良好的程序,而不是让代码成为服务器CPU和内存的杀手。 【Windows平台的参数调优】 通常我们都在Windows系统下面进行软件开发工作,因此在Window
在生产环境下对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服务器。
- -Xms512m
- -Xmx512m
- -XX:PermSize=256m
- -XX:MaxPermSize=256m
为了验证Tomcat是否成功启动,打开命令行输入命令:
- jps
命令提示符回显如下内容,其中Bootstrap即为Tomcat服务器进程,前面对应的8184即为Tomcat进程的进程号PID:
- 6540 Jps
- 1176
- 8184 Bootstrap
然后这个时候我们仍然不知道设置的VM Arguments是否真的在Tomcat启动时成功加载,为此输入命令
- jps -v
提示符回显如下内容,可以看到我们设置的VM Arguments参数确实是生效了的。
【Linux平台的参数调优】
通常情况下,生产环境的Tomcat服务器都部署在Linux系统下面,因此简要介绍Linux系统下面的有关设置,进入Tomcat的\bin目录:
- cd /usr/local/tomcat/bin
打开需要编辑的shell文件:
- vi catalina.sh
找到“# ----- Execute The Requested Command -----”行,在下面添加如下内容:
- JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=64m"
然后保存退出即可,重启Tomcat服务器之后,可通过进程查看命令查看Tomcat启动时所使用的VM Arguments参数:
- ps -ef | grep tomcat
可以看到Tomcat启动时所使用的VM Arguments参数:
【JVM优化参数说明】
在生产环境下可以设置的JVM参数远不止上面提到的这些。下面简要介绍一些常见的VM Arguments参数,理解并正确使用这些参数需要对JVM原理、堆内存结构、垃圾回收原理有比较深刻的认识,这里抛砖引玉了啦。
- -server
默认情况下JVM运行在client模式,通过设置该参数JVM将运行在server模式。
- -Xms512m -Xmx512m
设置Java堆内存的最大、最小值,通常设为一致以避免进行垃圾回收之后重新调整堆的大小。
- -XX:PermSize=256m -XX:MaxPermSize=256m
设置方法区的最大、最小值,如果使用Spring、Hibernate等框架技术,在运行时会生成大量 的动态代理类,有可能导致永久代内存溢出。
- -Xss1m
设置线程栈的大小,可以结合实际情况设置的小一点,以运行创建更多的线程数目。
- -XX:NewRatio=3
设置Java堆内存新生代、老年代的比例为1:3
- -XX:SurvivorRatio=8
新生代内存分配比例为Eden:From Survivor:To Survivor=8:1:1
- -XX:+UseParNewGC
新生代使用并行的ParNew收集器。
- -XX:ParallelGCThreads=2
并行收集的GC线程数目为2、和CPU内核数目一致。
- -XX:+UseConcMarkSweepGC
老年代使用CMS收集器。
- -XX:CMSInitiatingOccupancyFraction=70
老年代在堆内存使用率为70%开始进行Full GC
- -XX:+CMSParallelRemarkEnabled
老年代通过并行标记减少因为标记而导致的停顿时间
- -XX:+UseCMSCompactAtFullCollection
在进行Full GC时启用内存碎片整理
- -XX:CMSFullGCsBeforeCompaction=2
在整理内存碎片之前进行的Full GC的次数为2
- -XX:+CMSClassUnloadingEnabled
方法区允许进行类的卸载,防止方法区内存溢出
- -XX:+CMSPermGenSweepingEnabled
方法区的垃圾回收同时添加该参数,仅JDK1.6之前需要
- -XX:SoftRefLRUPolicyMSPerMB=0
设置软引用对象的回收策略,在堆内存紧张时立即回收所有的软引用对象
- -XX:MaxTenuringThreshold=5
新生代中的对象如果Age为5将被移动到老年代
- -XX:PretenureSizeThreshold=3145728
大于3MB(3145728 byte)的对象直接存放在老年代
- -XX:+DisableExplicitGC
禁用Syste.gc()代码进行Full GC,注意:有潜在的直接内存溢出可能
====================================
限于篇幅,无法对每个参数进行一一详解,理解每个VM Arguments参数的设置都需要对JVM原理的相关知识烂熟于心,并且还有更多的参数需要应用在生产环境,诸君努力!
更多推荐
所有评论(0)