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回收.

容器环境的JVM内存设置最佳实践 - JadePeng - 博客园

- -
Docker和K8S的兴起,很多服务已经运行在容器环境,对于java程序,JVM设置是一个重要的环节. 这里总结下我们项目里的最佳实践. 默认情况下,jvm自动分配的heap大小取决于机器配置,比如我们到一台64G内存服务器:. 可以看到,JVM 分配的最大MaxHeapSize为 16G,计算公式如下:.

JVM 内存分析工具 MAT 的深度讲解与实践——进阶篇

- - 掘金后端本月最热
注:本文原创,转发需标明作者及原文链接. 【0广告微信公众号:Q的博客】. 本系列共三篇文章, 本文是系列第2篇——进阶篇,详细讲解 MAT 各种工具的 核心功能、用法、适用场景,并在具体实战场景下讲解帮大家学习如何针对各类内存问题. JVM 内存分析工具 MAT 的深度讲解与实践——入门篇》 介绍 MAT 产品功能、基础概念、与其他工具对比、Quick Start 指南.

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》,订阅了硅谷产品类博客.

数据治理理论 + 实践

- - IT瘾-dev
数据治理无论是在数仓建设过程中还是数仓建设完成之后都是及其重要的,是数据部门基础建设的必经之路,是降本提效,形成企业数据资产的关键一环. 数据质量管理(Data Quality Management),是指对数据从计划、获取、存储、共享、维护、应用、消亡生命周期的每个阶段里可能引发的各类数据质量问题,进行识别、度量、监控、预警等一系列管理活动,并通过改善和提高组织的管理水平使得数据质量获得进一步提高.