JVM及Tomcat优化

Tomcat   性能调优

Tomcat启动行参数(JVM)优化

1.文件定位:catalina.bat

2.参数添加

set JAVA_OPTS = %JAVA_OPTS% -server -Xms1028M -Xmx1028M

-Xmn385M -Xss128k -XX:PermSize=256M

参数解释

-server : 位置必须为第一个参数

默认情况下,tomcat以java -client模式运行,toncat以server模式运行会有更大,更高的并发处理能力;更快的JVM垃圾回收;更多的负载和吞吐量

l -Xms (1/64) -Xmx (1/4) : JVM内存设置

l 前提:在设置下最大内存时,检验JVM最大可用内存

l 方法:cmd java -Xmx150m -version

l tomcat启动时会以最小内存设置值启动

l 默认空余内存小于40%时,JVM会增大到-Xmx;

l 空余内存大于70%时,JVM会缩小到-Xms;

l 通常设置最大最小的值一样避免每次GC后调整堆的大小。

-Xmn : 年轻代大小

堆大小=年轻代大小(young generation) + 年老代大小(tenured generation) + 持久代大小(permanet generation)

GC常用的是分代收集。

增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,

推荐配置为整个堆的3/8

l -Xmn : 年轻代大小

l 堆大小 =  年轻代大小(young generation) + 年老代大小(tenured generation) + 持久代大小(permanet generation)

l GC常用的是分代收集。

l 绝大部分的objec被分配在young generation(生命周期短),并且大部分的object在这里die。

l young generation满了之后,将引发minor collection(YGC)。在minor collection后存活的object会被移动到tenured generation(生命周期比较长)。

l tenured generation满之后触发major collection。major collection(Full gc)会触发整个heap的回收,包括回收young generation。

l permanet generation区域比较稳定,主要存放classloader信息。

l 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,

推荐配置为整个堆的3/8

young generation有eden、2个survivor 区域组成。其中一个survivor区域一直是空的,是eden区域和另一个survivor区域在下一次copy collection后活着的objecy的目的地。object在survivo区域被复制直到转移到tenured区。

我们要尽量减少 Full gc 的次数(tenured generation 一般比较大,收集的时间较长,频繁的Full gc会导致应用的性能收到严重的影响)。

-Xss : 每个线程的堆栈大小

一个线程占多少内存,多少线程同时运行,依程序而定

一般不超过 1M

-XX:+UseBiasedLocking :启动优化线程锁

每个http请求即一个线程,请求时间不定,出现请求排队现象,甚至线程阻塞

此配置使得服务器对线程处理自动进行最有配置

l -XX:PermSize(1/64)-XX:MaxPermSize(1/4):非堆内存

l JVM自己用的内存:方法区;内部处理;类结构;方法代码

l 这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入

l      PermGen space区域,它和存放Instance的Heap区域不同。

l GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,

所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。

-XX:+UseParNewGC

-XX:+UseConcMarkSweepGC

-XX:MaxTenuringThreshold

-XX:+CMSParallelRemarkEnabled

-XX:+UseCMSCompactAtFullCollection

-XX:LargePageSizeInBytes

-XX:+UseFastAccessorMethods

-XX:+UseCMSInitiatingOccupancyOnly

-XX:CMSInitiatingOccupancyFraction

-Djava.awt.headless=true

内存申请过程

l JVM会试图为相关Java对象在Eden中初始化一块内存区域;

l 当Eden空间足够时,内存申请结束。否则到下一步;

l JVM试图释放在Eden中所有不活跃的对象(minor collection),释放后若Eden空间  仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;

l Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;

l 当old区空间不够时,JVM会在old区进行major collection;

l 完全垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误";

对象衰老过程

l 新创建的对象的内存都分配自eden。Minor collection的过程就是将eden和在用survivor space中的活对象copy到空闲survivor space中。对象在young generation里经历了一定次数(可以通过参数配置)的minor collection后,就会被移到old generation中,称为tenuring。

Tomcat容器内优化

1.文件定位:server.xml

2.参数添加

URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300"  maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443"

参数解释

URIEncoding="UTF-8" :

解析含有中文名的文件的url

maxSpareThreads : 空闲状态的线程数

如果空闲状态的线程数多于设置的数目,则将这些线程终止,减少池中的线程总数

minSpareThreads : 最小备用线程数

tomcat启动时的初始化的线程数

maxThreads:最大并发数

Tomcat可创建的最大的线程数

acceptCount:等待队列的大小

acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,

这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection

useURIValidationHack

enableLookups="false"

disableUploadTimeout

gzip压缩(HTTP压缩)

监控(JDK的bin下的jconsole)

1.本机:直接监控则可以

1.非本机:指定ip,port

set JAVA_OPTS= %JAVA_OPTS% -Djava.rmi.server.hostname=192.168.1.17

set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8888

set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=false

set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false

测试

org.apache.commons.httpclient包的类:

HttpClient ;HttpMethod 等

疑问?Perm区 栈 存放内容的区别?

l JVM堆的Perm区:

l 保存class,method,filed对象;存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance

l GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误

l 栈:

l 当一个class文件被ClassLoader load进入JVM后,方法指令保存在Stack中

l java栈:

Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。

参考

http://blog.csdn.net/lifetragedy/article/details/7708724

JVM参数设置demo :

http://www.cnblogs.com/redcreen/archive/2011/05/05/2038331.html

JVM内存分析 :

http://blog.csdn.net/pochuanpiao/article/details/8147805

时间: 2024-08-19 09:05:30

JVM及Tomcat优化的相关文章

Linux下jvm与tomcat的安全与优化

上一节我们部署了tomcat服务,大家可以看到这个服务部署起来真的是非常的容易,但前提是你要学好前面的命令基础.今天我打算在上节的基础上给大家加深点儿,给大家讲讲tomcat服务的安全与优化!我们为什么不是把服务搭建好就可以了嘛,怎么还要做安全与优化呢?理论上是把服务部署好就可以了,但是为了我们的服务器运行的更安全更稳定!做安全优化是必须的了! 在上节我们知道jdk是个java虚拟机(JVM),既然是虚拟机,那他就有内存的概念,在Java虚拟机里他们是内存,但是叫法不一样,叫什么呢?看下面: J

tomcat优化

Tomcat中的线程池(APR和ThreadPool) 2. 在Connector中指定使用共享线程池: <Connector executor="tomcatThreadPool"           port="8080" protocol="HTTP/1.1"               connectionTimeout="20000"               redirectPort="8443&

jvm堆内存优化详解

在日常的运维工作中用到tomcat,都需要对tomcat中的jvm虚拟机进行优化,只有知道需要优化参数的具体用处,才能深刻体会优化jvm的意义所在. 在平常的工作中我们谈对jvm的优化,主要是针对java的堆内存的优化和垃圾回收机制的优化. JVM堆内存示意图: JVM的堆内存的组成: young generation:新生代 eden:伊甸园区 surived:存活区 其中存活区有2个,第1个为S0,第2个为S1 old generation:老年代 permanent generation:

Java应用容器介绍以及tomcat优化实战

     java开发语言在软件开发里面是比较火的,特别涉及到一些大型架构,一般都会使用java来开发软件,所以java容器使用和选型不一样.     1. Tomcat是Apache鼎力支持的Java Web应用服务器,由于它优秀的稳定性以及丰富的文档资料,广泛的使用人群,从而在开源领域受到最广泛的青睐.     2. Jboss作为Java EE应用服务器,它不但是Servlet容器,而且是EJB容器,从而受到企业级开发人员的欢迎,从而弥补了Tomcat只是一个Servlet容器的缺憾.  

tomcat 优化配置 &nbsp; by. java 8.0.25 &nbsp; &nbsp; &nbsp; tomcat 7.0.59

tomcat 优化配置 , 说明 一.并发优化 1.JVM调优 以下为1G物理内存tomcat配置: JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256K" -server:                一定要作为第一个参数,在多个CPU时性能佳 -Xms:                  初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些 -Xmx:                  java heap最大值,使用的最大内存 X

Tomcat学习总结(3)——Tomcat优化详细教程

Tomcat是我们经常使用的 servlet容器之一,甚至很多线上产品都使用 Tomcat充当服务器.而且优化后的Tomcat性能提升显著,本文从以下几方面进行分析优化. 一.内存优化 默认情况下Tomcat的相关内存配置较低,这对于一些大型项目显然是不够用的,这些项目运行就已经耗费了大部分内存空间,何况大规模访问的情况.即使是本文中的这个只有一个页面的超小项目,在并发达到一定程度后也会抛出以下类似异常: Java代码   严重: Exception invoking periodic oper

Tomcat优化方案

Tomcat是我们经常使用的 servlet容器之一,甚至很多线上产品都使用 Tomcat充当服务器.而且优化后的Tomcat性能提升显著,本文从以下几方面进行分析优化. 一.内存优化 默认情况下Tomcat的相关内存配置较低,这对于一些大型项目显然是不够用的,这些项目运行就已经耗费了大部分内存空间,何况大规模访问的情况.即使是本文中的这个只有一个页面的超小项目,在并发达到一定程度后也会抛出以下类似异常: Java代码   严重: Exception invoking periodic oper

tomcat优化实例

优化实例 启动参数优化JAVA_OPTS='-server -Xms512m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=512m -XX:+UseBiasedLocking -XX:+AggressiveOpts -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+

tomcat优化相关

一:Tomcat内存优化,启动时告诉JVM我要一块大内存(调优内存是最直接的方式) Windows 下的catalina.bat Linux 下的catalina.sh 如: JAVA_OPTS='-Xms256m -Xmx512m' -Xms<size> JVM初始化堆的大小 -Xmx<size> JVM堆的最大值 实际参数大小根据服务器配置或者项目具体设置. 二:Tomcat 线程优化 在server.xml中 如: <Connector port="80&qu