关于java:tomcat80的内存优化配置及垃圾回收管理

10次阅读

共计 4825 个字符,预计需要花费 13 分钟才能阅读完成。

一、Tomcat 并发优化

tomcat 并发量与其配置非亲非故,个别的机器几百的并发量足矣,如果设置太高可能引发各种问题,内存、网络等问题也能在高并发下裸露进去,因而,配置参数的设置十分重要。

(1) tomcat 并发参数

  1. maxThreads:最大的并发申请数,当 cpu 利用率高的时候,不宜减少线程的个数, 当 cpu 利用率不高,大部分是 io 阻塞类的操作时,能够适当减少该值。
  2. maxSpareThreads:Tomcat 连接器的最大闲暇 socket 线程数
  3. acceptCount:当解决工作的线程数达到最大时,承受排队的申请个数
  4. connectionTimeout:网络连接超时,单位毫秒
  5. enableLookups:若为 false 则不进行 DNS 查问,进步业务能力应设置为 false
  6. disableUploadTimeout:若为 true 则禁用上传超时

    以上是一些比拟罕用的参数,Tomcat 中 server.xml 配置详解 会有更加具体的介绍。

(2) tomcat 并发配置

 在 conf 下的 server.xml 文件中 <Connector> 节点进行配置
    <Connector port="8080" protocol="HTTP/1.1"
         connectionTimeout="30000"
         redirectPort="8443"
         maxThreads="400"
         minSpareThreads="50"
         maxSpareThreads="200"
         acceptCount="400"
         enableLookups="false"
         disableUploadTimeout="true"     /> 

二、Tomcat 内存配置

tomcat 个别都有默认的内存大小,其默认值对整个物理内存来说十分小,如果不配置 tomcat 的内存,会大大节约服务器的资源,验证影响零碎的性能,所以对 tomcat 的内存配置对用户量比拟大的零碎尤为重要。

(1) tomcat 内存参数

  1. -server:肯定要作为第一个参数,在多个 CPU 时性能佳
  2. Xms:java Heap 初始大小。默认是物理内存的 1 /64。
  3. -Xmx:java heap 最大值。倡议均设为物理内存的一半。不可超过物理内存。
  4. -XX:PermSize:设定内存的永恒保留区初始大小。缺省值为 64M。
  5. -XX:MaxPermSize:设定内存的永恒保留区最大 大小。缺省值为 64M。
  6. -Xmn:young generation(年老代)的 heap 大小。个别设置为 Xmx 的 3、4 分之一

(2) tomcat 内存配置

 在 bin 下的 catalina.bat 文件中 echo Using CATALINA_BASE:   "%CATALINA_BASE%" 的前一行退出如下代码。set JAVA_OPTS=%JAVA_OPTS% -server -Xms8192m -Xmx8192m -Xmn1890m 

三、Tomcat 垃圾回收

垃圾回收 (gc) 机制十分重要,有时零碎会因为内存没有及时回收导致内存溢出,或是内存饱和呈现无奈响应用户申请的状况,这就要要求咱们对闲暇内存进行清理,以确保零碎失常运行,tomcat GC 的最佳配置是确保零碎失常运行的要害。

(1) JVM 中对象的划分及治理

JVM 依据运行于其中的对象的生存工夫大抵的分为 3 种。并且将这 3 种不同的对象别离寄存在 JVM 从零碎调配到的不同的内存空间。这种对象寄存空间的治理形式叫做 Generation 治理形式。

  1. Young Generation(年老代):用于寄存“早逝”对象(即刹时对象)。例如:在创建对象时或者调用办法时应用的长期对象或局部变量。
  2. Tenured Generation(年轻代):用于寄存“驻留”对象(即较长时间被援用的对象)。往往体现为一个大型程序中的全局对象或长时间被应用的对象。
  3. Perm Generation(永恒保留区域):用于寄存“永恒”对象。这些对象治理着运行于 JVM 中的类和办法。

(2) jvm 垃圾收集参数

  1. -verbose:gc:显示垃圾收集信息(在虚拟机产生内存回收时在输出设备显示信息)
  2. UseConcMarkSweepGC:开启此参数应用 ParNew & CMS(serial old 为替补)收集器
  3. MaxTenuringThreshold:降职老年代的最大年龄。默认为 15,比方设为 10,则对象在 10 次一般 GC 后将会被放入年轻代。
  4. -XX:+ExplicitGCInvokesConcurrent:System.gc()能够与应用程序并发执行。
  5. GCTimeRatio:设置零碎的吞吐量。比方设为 99,则 GC 工夫比为 1 /1+99=1%,也就是要求吞吐量为 99%。若无奈满足会放大新生代大小。
  6. CMSInitiatingOccupancyFraction:触发 CMS 收集器的内存比例。比方 60% 的意思就是说,当内存达到 60%,就会开始进行 CMS 并发收集。
  7. CMSFullGCsBeforeCompaction:设置在几次 CMS 垃圾收集后,触发一次内存整理。
  8. -Xnoclassgc:禁用类垃圾回收,性能会高一点;
  9. -XX:SoftRefLRUPolicyMSPerMB=N:官网解释是:Soft reference 在虚拟机中比在客户集中存活的更长一些。其革除频率能够用命令行参数 -XX:SoftRefLRUPolicyMSPerMB= 来管制,这能够指定每兆堆闲暇空间的 soft reference 放弃存活(一旦它不强可达了)的毫秒数,这意味着每兆堆中的闲暇空间中的 soft reference 会(在最初一个强援用被回收之后)存活 1 秒钟。留神,这是一个近似的值,因为 soft reference 只会在垃圾回收时才会被革除,而垃圾回收并不总在产生。零碎默认为一秒。

    以上是一些根本的参数配置,通过 JVM 内存治理——垃圾收集器参数精解查看更具体的配置,通过 Tomcat 中 Java 垃圾收集调优查看原理

(3) tomcat 垃圾收集配置

tomcat 的垃圾收集是和内存设置一起配置的,内存和 gc 的设置也不是越大越好,良好的比例能够使你的零碎性能晋升个别甚至更多,上面是 tomcat7,服务器物理内存 16g 的标准配置

在 bin 下的 catalina.bat 文件中 echo Using CATALINA_BASE:   "%CATALINA_BASE%" 的前一行退出如下代码。

set JAVA_OPTS=%JAVA_OPTS% 
-server -Xms8192m -Xmx8192m -Xmn1890m -verbose:gc 
-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=5 -XX:+ExplicitGCInvokesConcurrent -XX:GCTimeRatio=19 -XX:CMSInitiatingOccupancyFraction=70 -XX:CMSFullGCsBeforeCompaction=0 -Xnoclassgc -XX:SoftRefLRUPolicyMSPerMB=0

 * 要把以上代码写在一行能力失效。* 

配置后零碎的 jvm 内存运行状况如下: 

能够看到零碎在内存达到 2g 后就会回收闲暇内存,根本不会产生溢出的状况,8g 的最大内存最高才用了 2g,阐明零碎的性能还是很优越的,用户数再减少也能在肯定水平上保证系统稳定性。

四、Tomcat 宕机预防

tomcat 在运行一段时间后,呈现无法访问的状况,查看内存齐全失常,查看服务器端口发现大量 close_wait,导致网络阻塞,以至于无奈响应无奈的申请,这就是 tomcat 最常常产生的宕机假死景象。

(1) TCP 端口状态

  1. LISTENING 状态 
    FTP 服务启动后首先处于侦听(LISTENING)状态。
  2. ESTABLISHED 状态 
    ESTABLISHED 的意思是建设连贯。示意两台机器正在通信。
  3. CLOSE_WAIT 
    对方被动敞开连贯或者网络异样导致连贯中断,这时我方的状态会变成 CLOSE_WAIT 此时我方要调用 close()来使得连贯正确敞开。
  4. TIME_WAIT 
    我方被动调用 close()断开连接,收到对方确认后状态变为 TIME_WAIT。TCP 协定规定 TIME_WAIT 状态会始终继续 2MSL(即两倍的分段最大生存期),以此来确保旧的连贯状态不会对新连贯产生影响。处于 TIME_WAIT 状态的连贯占用的资源不会被内核开释,所以作为服务器,在可能的状况下,尽量不要被动断开连接,以缩小 TIME_WAIT 状态造成的资源节约。

    更具体的 TCP 端口状态请参考 TCP 端口状态阐明

(2) Windows 零碎下的 TCP 参数

  1. KeepAliveTime 
    KeepAliveTime 的值控制系统尝试验证闲暇连贯是否依然完整的频率。如果该连贯在一段时间内没有流动,那么零碎会发送放弃连贯的信号,如果网络失常并且接管方是流动的,它就会响应。如果须要对失落接管方的状况敏感,也就是说须要更快地发现是否失落了接管方,请思考减小该值。而如果长期不流动的闲暇连贯的呈现次数较多,但失落接管方的状况呈现较少,那么可能须要增大该值以缩小开销。
    缺省状况下,如果闲暇连贯在 7200000 毫秒(2 小时)内没有流动,零碎就会发送放弃连贯的音讯。
  2. KeepAliveInterval 
    KeepAliveInterval 的值示意未收到另一方对“放弃连贯”信号的响应时,零碎反复发送“放弃连贯”信号的频率。在无任何响应的状况下,间断发送“放弃连贯”信号的次数超过 TcpMaxDataRetransmissions(下文将介绍)的值时,将放弃该连贯。如果网络环境较差,容许较长的响应工夫,则思考增大该值以缩小开销;如果须要尽快验证是否已失落接管方,则思考减小该值或 TcpMaxDataRetransmissions 值。
    缺省状况下,在未收到响应而从新发送“放弃连贯”的信号之前,零碎会期待 1000 毫秒(1 秒)。
  3. KeepAliveInterval 
    KeepAliveInterval 的值示意未收到另一方对“放弃连贯”信号的响应时,零碎反复发送“放弃连贯”信号的频率。在无任何响应的状况下,间断发送“放弃连贯”信号的次数超过 TcpMaxDataRetransmissions(下文将介绍)的值时,将放弃该连贯。如果网络环境较差,容许较长的响应工夫,则思考增大该值以缩小开销;如果须要尽快验证是否已失落接管方,则思考减小该值或 TcpMaxDataRetransmissions 值。
    缺省状况下,在未收到响应而从新发送“放弃连贯”的信号之前,零碎会期待 1000 毫秒(1 秒)。

    更多零碎参数请参考 Windows 零碎下的 TCP 参数

(3) tomcat 假死剖析及预防

close_wait 产生的起因是 TCP 连贯没有调用敞开办法,须要利用来解决网络链接敞开,对于 Web 申请呈现这个起因,常常是因为 Response 的 BodyStream 没有调用 Close,除了调整代码外,能够调整 windows 零碎参数解决 tomcat 假死问题

tomcat 假死时利用 netstat -ano 查看端口景象如下:
 
KeepLive 在 Windows 操作系统下默认是 7200000 毫秒,也就是 2 个小时才清理一次,对与大量 close_wait 状况下,能够减小其工夫 
在注册表的 [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters] 改变或创立以下项 
“KeepAliveTime”=dword:afc8 (45000 毫秒) 
“KeepAliveInterval”=dword:1 
“TcpMaxDataRetransmissions”=dword:”5″ 
状况会明显改善,但不保障大并发下服务器不会呈现假死景象,毕竟代码的规范性也占很大比重。

本文转载自:https://blog.csdn.net/chengxu…

正文完
 0