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



    1汤姆猫性能优化

    1.1连接参数

    1.1.1默认连接配置

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

    1.1.2连接参数调优

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

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

    1.1.3非阻塞式IO配置

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

    1.2 JVM参数

    1.2.1堆大小

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

    1.2.2方法区大小

    配置方法区大小参数如下:
    -XX:PermSize=512m -XX:MaxPermSize=512m
    避免由于加载 JarClass 过多导致的内存溢出。

    1.2.3垃圾回收策略

    修改新生代和老年代的 GC策略:
    -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled

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

    2.1 VisualVM vs. JProfiler

    VisualVM是JDK自带的性能监控工具,在JDKin目录下可以找到,可以监控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]
  • 相关阅读:
    回车代码兼容火狐浏览器
    js区分浏览器类型
    阶段总结(2014-07-23)
    Spring学习笔记 2014-7-9
    Maven学习笔记
    QQ协议的研究
    模仿微信打飞机做的程序
    滚动字幕
    13年8月15日阿里云服务器网络故障事件
    [转]程序员自己写的神器 MonoDevelop 4 (Xamarin Studio) Debugging for Unity
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157718.html
Copyright © 2020-2023  润新知