Tomcat面试之性能优化
文章树列

tomcat性能优化整理

1、你怎样给tomcat调优

1.JVM参数调优:-Xms<size>表示JVM初始化堆的大小,-

Xmx<size>表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。在catalina.bat中,设置JAVA_0PTS='-Xms256m-Xmx512m',表示初始化内存为256MB,可以使用的最大内存为512MB。

2、禁用DNS查询

当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值:

Tomcat4

〈ConnectorclassName="org.apache.coyote.tomcat4.CoyoteConnector"port="80"minProcessors="5"maxProcessors="75"enableLookups="false"redirectPort="8443"acceptCount="100"debug="0"connectionTimeout="20000"useURIValidationHack="false"disableUploadTimeout="true"/>

 

Tomcat5<Connectorport="80"maxThreads="150"minSpareThreads="25"maxSpareThreads="75"enableLookups="false"redirectPort="8443"acceptCount="100"debug="0"connectionTimeout="20000"disableUploadTimeout="true"/>

调整线程数

通过应用程序的连接器(Con nector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接更多的请求。

 

Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说,如果一天内每秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors的值。maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。

在Tomcat5对这些参数进行了调整,请看下面属性:

maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。

acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。

connnection Timeout网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

minSpareThreadsTomcat初始化时创建的线程数。

maxSpareThreads一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。

2、如何加大comcat连接数

在tomcat配置文件server.xml中的〈Connector/〉

配置中,和连接数相关的参数有:

minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10

maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100

enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false

connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。

 

web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。tomcat5中的配置示例:

<Connectorport="8080"maxThreads="150"minSpareThreads="25"maxSpareThreads="75"enableLookups="false"redirectPort="8443"acceptCount="100"debug="0"connectionTimeout="20000"disableUploadTimeout="true"/>

对于其他端口的侦听配置,以此类推。

3、怎样加大tomcat的内存

首先检查程序有没有限入死循环

这个问题主要还是由这个问题java.lang.OutOfMemoryError:Java heapspace

引起的。第一次出现这样的的问题以后,引发了其他的问题。在网上一查可能是JAVA的堆栈设置太小的原因。

跟据网上的答案大致有这两种解决方法:

1、设置环境变量

解决方法:手动设置Heap size

 

修改TOMCAT_HOME/bin/catalina.sh

setJAVA_0PTS=-Xms32m-Xmx512m

可以根据自己机器的内存进行更改。

 

2、 java-Xms32m-Xmx800m className

就是在执行JAVA 类文件时加上这个参数,其中 className

是需要执行的确类名。(包括包名)这个解决问题了。而且执行的速度比 没有设置的时候快很多。如果在测试的时候可能会用 Eclisp e 这时候就需要 在Eclipse->run-arguments 中的 VM arguments 中输入-Xms32m- Xmx800m 这个参数就可以了。

后来在Eclilpse 中修改了启动参数,在 VMarguments 加入了

-Xms32m-Xmx800m,问题解决。

一、java.lang.OutOfMemoryError:PermGen space

PermGen space 的全称是 Permanent Generation space,是指内存的 永久保存区域, 这块内存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被Loader 时就会被 放到 PermGen space 中,它和存放类实例(Instance)的Heap 区域不 同,GC(Garbage Collection)不会在主程序运行期对 PermGen space 进行清理,所以如果你的应用中有很多 CLASS 的话, 就很可能出现PermGen space 错误,这种错误常见在 web 服务器对 JSP 进行preco mpile 的时候。

如果你的WEB APP 下都用了大量的第三方 jar, 其大小超过了 jvm 默认的大小

(4M)那么就会产生此错误信息了。

解决方法:手动设置 MaxPermSiz e 大小修改 TOMCAT_HOME/bin/catalina.sh

在"echo"Using CATALINA_BASE:$CATALINA_BASE"”上面加入以下 行: JAVA_0PTS="-server-XX:PermSize=64M-XX:MaxPermSize=128m 建议:将相同的第三方jar 文件移置到tomcat/shared/lib 目录下,这样 可以达到减少jar 文档重复占用内存的目的。

二、 java.lang.OutOfMemoryError:Java heap space Heap size 设置

JVM 堆的设置是指java 程序运行过程中 JVM 可以调配使用的内存空间的设置JVM 在启动的时候会自动设置 Heap size 的值,

其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存 的1/4。可以利用JVM 提供的-Xmn-Xms-Xmx 等选项可进行设置。Heap size 的大小是 Young Generation 和 TenuredGeneraion

之和。

提示:在 JVM 中如果 98%的时间是用于 GC 且可用的Heap size 不足 2% 的时候将抛出此异常信息。

提示:Heap Size 最大不要超过可用物理内存的 80%,—般的要将-

Xms 和-Xmx 选项设置为相同,而-Xmn 为 1/4 的-Xmx 值。解决方法:手动设置 Heap size

修改 TOMCAT_HOME/bin/catalina.sh

在"echo"Using CATALINA_BASE:$CATALINA_BASE"”上面加入以下行:

JAVA_OPTS=H-server-Xms800m-Xmx800m-XX:MaxNewSize=256mH

三、实例,以下给出 1G 内存环境下java jvm 的参数设置参考:

JAVA_OPTS="-server-Xms800m-Xmx800m-XX:PermSize=64M- XX:MaxNewSize=256m-XX:MaxPermSize=128m- Djava.awt.headless=true"

很大的web 工程,用 tomcat 默认分配的内存空间无法启动,如果不是在

myeclips e 中启动 tomcat 可以对 tomcat

这样设置:

TOMCAT_HOME/bin/catalina.bat 中添加这样一句话:

set JAVA_OPTS=-server-Xms2048m-Xmx4096m-XX:PermSize=512M-

 

XX:MaxPermSize=1024M-Duser.timezone=GMT+08

或者

set JAVA_OPTS=-Xmx1024M-Xms512M-XX:MaxPermSize=256m

如果要在myeclipse 中启动,上述的修改就不起作用了,可如下设置:

Myeclipse->preferences->myeclipse->servers->tomcat-

>tomcatx.x->JDK 面板中的 Optional Java VM arguments 中添加:-

Xmx1024M-Xms512M-XX:MaxPermSize=256m

以上是转贴,但本人遇见的问题是:在 myeclipse 中启动Tomcat 时,提示"ava.lang.OutOfMemoryError:Java heap space",解决办法就 是: Myeclipse->preferences->myeclipse>servers->tomcat-

>tomcatx.x->JDK 面板中的

 

Optional Java VM arguments 中添加:-Xmx1024M-Xms512M- XX:MaxPermSize=256m

 

Tomcat 的优化经验

Tomcat 作为web 服务器,它的处理性能直接关系到用户体验,下面是种 常见的优化措施:

•去掉对web.xml 的监视,把jsp 提前编辑成 Servlet。有富余物理内 存的情况,加大tomcat 使用的jvm 的内存。

•服务器资源

服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。

•对于高并发情况下会有大量的运算,那么 CPU 的速度会直接影响到处理 速度。

•内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用

-Xmx-Xms-XX:MaxPermSize 等参数对内存不同功能块进行划分。我们之 前就遇到过内存分配不足,导致虚拟机一直处于full GC ,从而导致处 理能力严重下降。

•硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为 性

 

能瓶颈。最好的办法还是利用下面提到的缓存。

•利用缓存和压缩

对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我 们采用了Nginx 作为缓存服务器,将图片、css、js 文件都进行了缓存,有 效的减少了后端tomcat 的访问。另外,为了能加快网络传输速度,开启 gzip 压缩也是必不可少的。但考虑到 tomcat 已经需要处理很多东西了,所 以把这个压缩的工作就交给前端的 Nginx 来完成。

除了文本可以用gzip 压缩,其实很多图片也可以用图像处理工具预先进行 压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我 就见过一个图片从 300 多 kb 压缩到几十 kb,自己几乎看不出来区别。

•采用集群

单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat 集群是有效提升性能的手段。我们还是采用了 Nginx 来作为请求分流的服务器,后端多个 tomcat 共享session 来协同工作。可以参考之前写的

《利用nginx+tomcat+memcached 组建web 服务器负载均衡》。

•优化tomcat 参数这里以tomcat 7 的参数配置为例,需要修改 conf/server.xml

文件,主要是优 化连接配置,关闭客户端 dns 查询。

<Connector port=H8080H protocol=uorg.apache.coyote.http11.Http11NioProtocolH connectionTimeout=H20000H

redirectPort="8443" maxThreads="500" minSpareThreads="20"

 

acceptCount="100" disableUploadTimeout="true" enableLookups="false" URIEncoding="UTF-8"/>

新版下载
本文原创,商业转载请联系作者获得授权,非商业转载请注明出处。

评论

发送评论 编辑评论


                        

后端技术分类热门文章

标签热门文章排行

☛免责声明 ☛本站使用教程
Theme Argon With Ry-Plus By 清欢
我的第21753位朋友,历经126836次回眸才与你相遇
内容失效/资源代找/交流学习
内容失效/资源代找/交流学习