ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Tomcat--调优

2020-12-03 23:35:04  阅读:198  来源: 互联网

标签:maxThreads Tomcat space -- XX 调优 线程 内存


一 内存优化(内存溢出)

 Tomcat内存优化主要是对 tomcat 启动参数优化,可以在 tomcat 的启动脚本 catalina.sh(在此文件第一行开始添加新的设置即可)中设置 JAVA_OPTS 参数

 注:要加“m”,说明是MB,否则就是KB,在启动tomcat时会报内存不足

JAVA_OPTS=”-server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m -Djava.awt.headless=true”

  -server          以服务端模式启动,启动速度会稍微慢点,但性能会高很多

  -Xms          java虚拟机初始化时的初始堆大小(一般设为物理内存的二分之一~四分之一)

  -Xmx          java虚拟机可使用的最大堆大小

  -XX:PermSize      内存永久保留区域

  -XX:MaxPermSize     内存最大永久保留区域(老生代对象能占用内存的最大值)

  java.awt.headless=true  与图形操作有关,适用于Linux系统

 

 永久保存区:

  PermGen space的全称是Permanent Generation space,是指内存的永久保存区域

  这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理

  所以如果APP会LOAD很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候,jvm的gc是不会清理PemGen space的,导致内存溢出

 常见内存溢出情况:

  OutOfMemoryError: Java heap space  #堆溢出,若不是程序逻辑bug,可能是项目中引用的jar较多导致

  OutOfMemoryError: PermGen space   #永久保存区域溢出,通常由于加载了过多的类导致

  OutOfMemoryError: unable to create new native thread  #当JVM的heap size设置过大时,thread的创建数量便会减少

 解决方法:

  1 调整-Xms -Xmx参数可以解决第一种情况

   64位操作系统对堆内存大小无限制

   堆的大小可以使用 java -Xmx***M  -version 命令来测试,***位置填写想设置的内存大小,支持的话会出现jdk的版本号,不支持会报错

   -Xms -Xmx一般配置成一样比较好

   注:java -Xmx***M  version 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize的和,比如系统支持最大的jvm堆大小是1.5G,那  -Xmx1024m  -XX:PermSize=768M 是无法运行的

  2 加大-XX:PermSize  -XX:MaxPermSize来解决第二种情况

  3 首先分析是否是BUG导致

   1)如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么必须解决这个bug,修改参数是不能解决问题的

   2)如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数:

    a, MaxProcessMemory 使用64位操作系统

    b, JVMMemory   减少JVMMemory的分配  使用tomcat的catalina.sh这里配置:JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=512m-XX:MaxPermSize=256m

    c, ThreadStackSize  减小单个线程的栈大小

   注:这个异常问题的本质是:创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生

     即,给JVM内存越多,那么能创建的线程越少,越容易发生 java.lang.OutOfMemoryError: unable to create new native thread

 

二 并发优化

 线程池设置:

  线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可以通过调整连接器属性“maxThreads”完成设置

  maxThreads的值应该根据流量的大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处理

  如果设置的太大,Tomcat的启动将花费更多时间。因此它取决于我们给maxThreads设置一个正确的值

  超过最大并发数时,任何多出的并发请求将收到“拒绝连接”的错误提示,直到另一个处理请求进程被释放

  最好使用“Tomcat集群”的多个实例,即:如果有“1000”请求,两个Tomcat实例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000

org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (500) are  currently busy, waiting. Increase maxThreads (500) or check the servlet status
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
<Connector port="8081" protocol="HTTP/1.1"
      maxHttpHeaderSize="8192"     #客户端Http请求、响应的Header的最大限制 connectionTimeout="20000"    #连接超时时间 maxThreads="500"         #客户请求最大线程数 minSpareThreads="100"      #Tomcat初始化时创建的 socket 线程数 maxSpareThreads="1000"      #Tomcat连接器的最大空闲 socket 线程数 minProcessors="100"        #服务器创建时的最小处理线程数 maxProcessors="1000"       #服务器同时最大处理线程数 enableLookups="false"      #若设为true, 则支持域名解析,可把 ip 地址解析为主机名 URIEncoding="utf-8"        #URL统一编码 acceptCount="1000"        #监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads) disableUploadTimeout="true" redirectPort="8443" />      #在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口

 

三 内核优化

 Tomcat运行过程中可能会出现大量ESTABLISHED连接与Time_Wait连接

netstat -tan | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
netstat -n | grep 8009 | wc -l

 内核调优参见:https://www.cnblogs.com/Xinenhui/p/14083555.html

标签:maxThreads,Tomcat,space,--,XX,调优,线程,内存
来源: https://www.cnblogs.com/Xinenhui/p/14083563.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有