您的位置:首页 > 其它

JVM理论与实践【JVM参数调优】

2015-12-17 18:44 381 查看
在生产环境下对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代码


-Xms512m

-Xmx512m

-XX:PermSize=256m

-XX:MaxPermSize=256m

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

Shell代码


jps

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


Shell代码


6540 Jps

1176

8184 Bootstrap

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

Shell代码


jps -v

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



【Linux平台的参数调优】

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

Shell代码


cd /usr/local/tomcat/bin

打开需要编辑的shell文件:


Shell代码


vi catalina.sh

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


Shell代码


JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=64m"

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


Shell代码


ps -ef | grep tomcat

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



【JVM优化参数说明】

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


Shell代码


-server

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

Shell代码


-Xms512m -Xmx512m

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

Shell代码


-XX:PermSize=256m -XX:MaxPermSize=256m

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

Shell代码


-Xss1m

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

Shell代码


-XX:NewRatio=3

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

Shell代码


-XX:SurvivorRatio=8

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

Shell代码


-XX:+UseParNewGC

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

Shell代码


-XX:ParallelGCThreads=2

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

Shell代码


-XX:+UseConcMarkSweepGC

老年代使用CMS收集器。

Shell代码


-XX:CMSInitiatingOccupancyFraction=70

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

Shell代码


-XX:+CMSParallelRemarkEnabled

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

Shell代码


-XX:+UseCMSCompactAtFullCollection

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

Shell代码


-XX:CMSFullGCsBeforeCompaction=2

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

Shell代码


-XX:+CMSClassUnloadingEnabled

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

Shell代码


-XX:+CMSPermGenSweepingEnabled

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

Shell代码


-XX:SoftRefLRUPolicyMSPerMB=0

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

Shell代码


-XX:MaxTenuringThreshold=5

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

Shell代码


-XX:PretenureSizeThreshold=3145728

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

Shell代码


-XX:+DisableExplicitGC

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


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

限于篇幅,无法对每个参数进行一一详解,理解每个VM Arguments参数的设置都需要对JVM原理的相关知识烂熟于心,

并且还有更多的参数需要应用在生产环境,诸君努力!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: