• 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.非本机:指定ipport

    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对象;存放ClassMeta信息,Class在被Load的时候被放入该区域Heap space:存放Instance

    l GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APPLOAD很多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

  • 相关阅读:
    Struts2---配置文件讲解及简单登录示例
    Struts2---环境搭建及包介绍
    Struts2---概述
    Spring---bean的作用域
    Spring---bean的实例化
    Sql Server 2005 .bak备份文进行还原数据库
    Windows Server 2003 R2 With Sp2 序列号
    [Idea]安装avtiviti插件以及 插件中文乱码
    IDEA 跑spring项目找不到get,set的问题
    SpringBoot 集成Avtiviti步骤
  • 原文地址:https://www.cnblogs.com/dobestself-994395/p/4613860.html
Copyright © 2020-2023  润新知