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

标签: jvm 理论 实践 | 发表时间:2014-09-21 23:54 | 作者:
出处:http://www.iteye.com

         在生产环境下对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 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [jvm 理论 实践] 推荐:

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

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

JVM理论与实践【堆内存结构与垃圾回收】

- - ITeye博客
        在生产环境下,通常都需要对JVM进行参数优化,其中对垃圾回收器的参数优化是一个非常重要的一方面. 下面重点介绍Java的堆内存,垃圾回收算法,常用的垃圾回收器以及Java堆内存的分配策略,这些内容将作为对JVM进行垃圾回收参数优化的重要基础. 然后通过简单示例验证Java的垃圾回收机制.

java 内存移到堆外!!! Jvm gcih 淘宝优化JVM实践

- - CSDN博客互联网推荐文章
出自Jvm  GC-Invisible Heap. GC-Invisible Heap,简称GCIH,是一种将Java对象从Java堆内移动到堆外,并且可以在JVM间共享这些对象的技术. GCIH顾名思义就是GC访问不到的堆,它是对JVM内存管理机制的一个有益的补充. 在某些特殊的应用中有大量生命周期很长的对象,在应用运行的整个过程中它们都存在,不需要被GC回收.

Hive Lock 理论与实践

- - leejun2005的个人页面
最近两天数据仓库中一张核心表遭遇了锁的问题,导致数据插入失败,影响挺大,之前一直没注意到这个问题,借此总结一下这块的知识和遇到的坑. hive 在 0.7 版本之后开始支持并发,线上的环境默认是用 zookeeper 做 hive 的锁管理,Hive开启并发功能的时候自动开启锁功能. hive 目前主要有两种锁,SHARED(共享锁 S)和 Exclusive(排他锁 X).

JVM研究

- - 开源软件 - ITeye博客
每天接客户的电话都是战战兢兢的,生怕再出什么幺蛾子了. 我想Java做的久一点的都有这样的经历,那这些问题的最终根结是在哪呢. JVM全称是Java Virtual Machine,Java虚拟机,也就是在计算机上再虚拟一个计算机,这和我们使用 VMWare不一样,那个虚拟的东西你是可以看到的,这个JVM你是看不到的,它存在内存中.

jvm调优

- - 互联网 - ITeye博客
printf "%x\n" 21742  找到耗时最长的进程. jstack pid | grep 54ee  定位某个类的方法. jstack 10535|grep -A 10 2a1d (最后十行). jmap 查询pid 内存线程. 附:TOP命令中需要关注的值:. (1)load average:此值反映了任务队列的平均长度;如果此值超过了CPU数量,则表示当前CPU数量不足以处理任务,负载过高.

【外刊IT评论网】理论与实践

- - 外刊IT评论
你每天都在仔细翻阅Hacker News,惊奇于那些经过整理的创业传奇、功效无比的最佳实践理论、天才的技术解决方案,以及各种链接指向的大量的一站式的,极简主义的,色彩柔和的网站. 你参加过精益(Lean)创业研讨会,读过了《Four Steps to the Epiphany》,订阅了硅谷产品类博客.

学习JVM的References

- LightingMan - 淘宝JAVA中间件团队博客
本blog中列举了我学习JVM的references,会不断的更新,为了避免版权问题,就不在blog上提供references的下载了,感兴趣的同学可自行下载或购买,:). |— [ Hotspot GC论文 ]. |— [ 其他JVM GC ]. |— Linux内核源代码情景分析. |— Linux 内核中断内幕.

深入理解JVM

- 小伟 - ITeye论坛最新讨论
1   Java技术与Java虚拟机. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API). 图1   Java四个方面的关系. 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件).

jvm垃圾回收

- Cano - 淘宝共享数据平台 tbdata.org
在jvm中堆空间划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation). 年轻代和年老代是存储动态产生的对象. 永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等. 我们这里讨论的垃圾回收主要是针对年轻代和年老代.