您的位置:首页 > 运维架构 > Tomcat

Tomcat性能优化及常用命令整理

2013-09-21 15:03 591 查看


1汤姆猫性能优化


1.1连接参数

1.1.1默认连接配置

[align=justify]默认连接器采用阻塞式 IO,默认最大线程数为200,配置如下:[/align]
[align=justify]<Connector port="8080" protocol="HTTP/1.1"[/align]
[align=justify] connectionTimeout="20000"[/align]
[align=justify] redirectPort="8443" URIEncoding="gbk" useBodyEncodingForURI="true" />[/align]

1.1.2连接参数调优

[align=justify]可通过下面属性配置优化默认连接器:[/align]
[align=justify]<Connector port="8080" protocol="HTTP/1.1"[/align]
[align=justify] connectionTimeout="20000"[/align]
[align=justify] redirectPort="8443" URIEncoding="gbk" useBodyEncodingForURI="true"[/align]
[align=justify] maxThreads="300" minSpareThreads="50"[/align]
[align=justify]maxSpareThreads="100" acceptCount="1000" />[/align]

[align=justify]参数解释如下:[/align]

[align=center]参数配置[/align]
[align=center]参数含义[/align]
[align=justify]maxProcessors[/align]
[align=justify]Tomcat4 支持[/align]
[align=justify]minProcessors[/align]
[align=justify]Tomcat4 支持[/align]
[align=justify]maxThreads="300"[/align]
[align=justify]最大线程数[/align]
[align=justify]minSpareThreads="50"[/align]
[align=justify]初始化时创建的线程数[/align]
[align=justify]maxSpareThreads="100"[/align]
[align=justify]一旦创建的线程超过这个值, Tomcat 就会关闭不再需要的 socket线程[/align]
[align=justify]acceptCount="1000"[/align]
[align=justify]指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理[/align]
1.1.3非阻塞式IO配置

[align=justify]使用非阻塞 IO连接器,只需将上面Connector配置中的 protocol协议部分改为:[/align]
[align=justify]<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"[/align]
[align=justify] connectionTimeout="20000"[/align]
[align=justify] redirectPort="8443" URIEncoding="gbk" useBodyEncodingForURI="true"/>[/align]

1.2 JVM参数

1.2.1堆大小

[align=justify]配置堆大小参数如下:[/align]
[align=justify]-Xms1024m –Xmx2048m[/align]
[align=justify]避免由于堆内存不足导致的内存溢出。[/align]

1.2.2方法区大小

[align=justify]配置方法区大小参数如下:[/align]
[align=justify]-XX:PermSize=512m -XX:MaxPermSize=512m[/align]
[align=justify]避免由于加载 Jar包Class 过多导致的内存溢出。[/align]

1.2.3垃圾回收策略

[align=justify]修改新生代和老年代的 GC策略:[/align]
[align=justify]-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled[/align]

[align=justify]参数解释如下:[/align]

[align=center]参数配置[/align]
[align=center]参数含义[/align]
[align=justify]-XX:+UseParNewGC[/align]
[align=justify]新生代采用 ParNewGC 多线程收集器[/align]
[align=justify]-XX:+UseConcMarkSweepGC[/align]
[align=justify]老年代采用 CMS 收集器,降低 GC停顿时间[/align]
[align=justify]-XX:+CMSParallelRemarkEnabled[/align]
[align=justify]降低标记阶段的停顿时间[/align]
[align=justify]-XX:+UseCMSCompactAtFullCollection[/align]
[align=justify]CMS 基于标记- 清除,会产生碎片,通过此配置在 CMS 收集后做一次压缩整理[/align]
[align=justify]-XX:CMSFullGCsBeforeCompaction=0[/align]
[align=justify]配置多少次 CMS GC 后,做一次压缩整理,就不用每次都做压缩整理了[/align]
[align=justify]-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80[/align]
[align=justify]当老年代使用 80 %后开始CMS 收集,默认值为 68% 。因为CMS 收集会有延迟,所以不能等到老年代占满时再收集[/align]
[align=justify]-XX:+CMSClassUnloadingEnabled[/align]
允许CMS 收集方法区 (PermGen) 。
[align=justify]JDK6 Update 3 及之前版本还需指定 -XX:+CMSPermGenSweepingEnabled参数[/align]
[align=justify] [/align]

2常用命令整理

2.1 VisualVM vs. JProfiler

VisualVM是JDK自带的性能监控工具,在JDK\bin目录下可以找到,可以监控JVM的内存、

CPU、线程等情况,使用很方便。JProfiler是收费的性能监控工具,功能都差不多。

但这两者只能对本地Java应用进行堆中对象的监控,远程应用JProfiler需要部署额外的Agent,

或者将堆dump到远程服务器上,再下载到本地用VisualVM打开来查看,不能做到实时监控。

所以有时我们还需要在远程服务器上使用一些命令和工具进行监控。

2.2 JMap & JStat

使用JMap可以解决上面提到的问题,并通过Linux的watch命令达到实时监控的效果。

例如,通过下面命令打印堆上apache包占用内存最大的前30个对象,每一秒刷新一次:

watch -n 1 -d "jmap -histo:live [pid] | grep "apache" | head -n 30"

输出结果如下:

num #instances #bytes class name

----------------------------------------------

1: 226810 34953232 <constMethodKlass>

2: 226810 30857024 <methodKlass>

3: 23748 25330568 <constantPoolKlass>

4: 23748 18308832 <instanceKlassKlass>

5: 127546 17364792 [C

6: 18895 14344152 <constantPoolCacheKlass>

7: 23805 13295216 [I

8: 31302 12693272 [B

9: 179826 10561520 <symbolKlass>

10: 140792 4505344 java.lang.String

11: 24852 2584608 java.lang.Class

12: 3056 2019600 <methodDataKlass>

13: 60750 1944000 java.util.HashMap$Entry

14: 31562 1892608 [S

15: 19211 1813536 [Ljava.util.HashMap$Entry;

16: 37068 1746912 [[I

17: 22808 1268080 [Ljava.lang.Object;

18: 14385 1265880 java.lang.reflect.Method

19: 18487 887376 org.apache.catalina.loader.ResourceEntry

20: 20590 823600 java.util.LinkedHashMap$Entry

21: 1075 627800 <objArrayKlassKlass>

22: 12469 598512 java.util.HashMap

23: 14416 576640 java.lang.ref.SoftReference

24: 11032 441280 java.util.concurrent.ConcurrentHashMap$Segment

JStat可以用来查看JVM的一些统计信息,及GC的情况等。JStat命令本身支持了定时刷新功能。

jstat -gc [pid] 2000 10

具体参数含义如下:

jstat -class pid:显示加载class的数量,及所占空间等信息。

jstat -compiler pid:显示VM实时编译的数量等信息。

jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。

jstat -gcnew pid:new对象的信息。

jstat -gcnewcapacity pid:new对象的信息及其占用量。

jstat -gcold pid:old对象的信息。

jstat -gcoldcapacity pid:old对象的信息及其占用量。

jstat -gcpermcapacity pid: perm对象的信息及其占用量。

jstat -util pid:统计gc信息统计。

jstat -printcompilation pid:当前VM执行的信息。

2.3堆外内存查看工具

对于堆外内存的使用率,可以使用rednaxelafx做的一个工具来查看:
https://gist.github.com/rednaxelafx/1593521
使用方法很简单,编译一个Java类后执行即可:

javac -cp .:/export/servers/jdk1.6.0_25/lib/sa-jdi.jar DirectMemorySize.java
java -cp .:/export/servers/jdk1.6.0_25/lib/sa-jdi.jar DirectMemorySize -e [pid]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: