Tomcat调优

发布时间:2023年12月23日

内存大小

? 默认大小:命令 jmap -heap pid

	jmap -heap pid
	
	部分值:
Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2063597568 (1968.0MB)
   NewSize                  = 42991616 (41.0MB)
   MaxNewSize               = 687865856 (656.0MB)
   OldSize                  = 87031808 (83.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

堆的默认大小是1968M,不到两个G,新生代656M,老年代83M,这个大小在提取大数据的时候很容易内存溢出,我们默认就碰到了。

新生代和老年代的比例一般设置为1:2 ,基本原则是让新生代设置尽量小一点,让垃圾回收在新生代回收多一点,老年代因为比例比较大,空间比较足,

他的回收次数会稍微少一点,老年代的垃圾回收是MajorGC,也就是Full GC,时间较长;新生代是对象初始的地方,所以会频繁的GC,对象经历多次GC默认是15或者较大的对象会直接到老年代,所以老年代的空间要大一点,默认只有83M,不内存溢出才有鬼了。

我生产上的参数,可以设置在catalina.sh里面最开始的地方,也可以设置在自启动脚本中

export JAVA_OPTS="-server -Xms3072m -Xmx3072m -Xmn900m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:PermSize=256M -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc_jsb.log -XX:+UseParNewGC -XX:-OmitStackTraceInFastThrow -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5"

-server: 因为tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量等,所以生产上一般都会用server模式。

-Xms和–Xmx:内存分配值,堆大小,一个是初始值,一个是最大值,一般都要设置为同样大小,因为如果内存达到最大值开始回落到初始值的时候肯定触发了GC机制,老年代区回收内存触发MajorGC,也就是我们说的Full GC 世界暂停,触发Full GC会停止(STW)所有线程去等待GC完成,所以会CPU高速运转,严重的时会感觉到系统卡顿等现象,所以一般设置为一样大小即可。命令java -Xmx2048M -version可以检测你的java支不支持设置2G内存,现在基本都是64位的jdk,所以一般都支持,如果是32位的可能需要检测一下,如果正常显示java版本,说明支持。

-Xmn: 新生代大小

-XX:MaxNewSize:新生代占整个堆内存的最大值。

-XX:NewRatio=2 新生代和老年代的比例

-XX:MetaspaceSize=128 #Metaspace是所有线程共享的一块内存区域,主要存放已被虚拟机加载的类定义,方法定义,常量等一些元数据信息,MetaspaceSize 表示的并非是元空间的大小,它的含义是:主要控制matesaceGC发生的初始阈值,也就是最小阈值。也就是说当使用的matespace空间到达了MetaspaceSize的时候,就会触发Metaspace的GC
-XX:MaxMetaspaceSize=512m #MaxMetaspaceSize表示的是保证committed的内存不会超过这个值,一旦超过这个值就会触发GC。注意:在jvm启动的时候,并不会分配MaxMetaspaceSize这么大的一块内存出来,metaspace是可以一直扩容的,直到到达MaxMetaspaceSize;

-XX:PermSize:设置非堆内存初始值,默认是物理内存的1/64。在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

-XX:MaxPermSize:Perm(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。

-XX:+DisableExplicitGC 在程序代码中不允许有显示的调用”System.gc()

-XX:+UseParNewGC 对年轻代采用多线程并行回收,这样收得快

-XX:+UseConcMarkSweepGC 即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。

XX:MaxTenuringThreshold 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

这个值,默认是15吧

-XX:CMSFullGCsBeforeCompaction=5 内存导致大量的内存碎片,可以在5次GC之后,做一次Compaction压缩操作

-XX:CMSInitiatingOccupancyFraction=75 老年代带到75%的时候触发内存回收机制

-XX:+UseCMSInitiatingOccupancyOnly 该参数启用后,参数CMSInitiatingOccupancyFraction才会生效。默认关闭。

-Xss:是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory。
-XX:+AggressiveOpts:启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术。
-XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。

-Xloggc:/opt/app/ard-user/ard-user-gc-%t.log 设置日志目录和日志名称

-XX:+UseGCLogFileRotation 开启滚动生成日志

-XX:NumberOfGCLogFiles=5 滚动GC日志文件数,默认0,不滚动

-XX:GCLogFileSize=20M GC文件滚动大小,需开启UseGCLogFileRotation

-XX:+PrintGCDetails 开启记录GC日志详细信息(包括GC类型、各个操作使用的时间),并且在程序运行结束打印出JVM的内存占用情况

-XX:+ PrintGCDateStamps 记录系统的GC时间

-XX:+PrintGCCause 产生GC的原因(默认开启)

容器的优化

 <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
        connectionTimeout="20000"
        redirectPort="8443"
        executor="tomcatThreadPool"
        enableLookups="false"
        acceptCount="2000"
        maxPostSize="10485760"
        compression="on"
        disableUploadTimeout="true"
        compressionMinSize="2048"
        noCompressionUserAgents="gozilla, traviata"
        acceptorThreadCount="2"
        compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
        URIEncoding="utf-8"/>

    <!-- A "Connector" using the shared thread pool-->
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
             maxThreads="2000" minSpareThreads="300"
         prestartminSpareThreads="true" maxQueueSize="500"/>
         
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true"
               maxParameterCount="1000">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="/weblogic/app/pts/apache-tomcat-9.0.80/conf/keystoremp.jks"
                      certificateKeystorePassword="mpstore"
                      certificateKeyPassword="mpkey"
                      type="RSA"/>
        </SSLHostConfig>
    </Connector>

protocol 协议类型,可选类型有4种,BIO(阻塞型IO),NIO,NIO2和APR;BIO(Blocking I/O) 阻塞式I/O操作,Java nio是一个基于缓冲区、非阻塞I/O操作的Java API它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8在Linux系统中默认使用这种方式,如果是7的话需要设置protocol=“org.apache.coyote.http11.Http11NioProtocol”表示使用NIO,org.apache.coyote.http11.Http11Nio2Protocol表示使用NIO2,性能更好吧

URIEncoding=”UTF-8” 使得tomcat可以解析含有中文名的文件的url

maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

minSpareThreads 最少空闲线程数

executor=“commonThreadPool” 指定线程池

maxThreads :Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数,所以这也决定了QPS的数量。

acceptCount:是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse 、

connectionTimeout:为网络连接超时时间毫秒数。

compression:是否开启JZip压缩

compressionMinSize:压缩处理的最小大小是多少,即包的大小超过这个配置才进行压缩,单位是k,默认是2048

disableUploadTimeout:是否给一些配置为上传的servlet放宽超时时长,单独配置超时时长

maxConnections:最大连接数,一般和maxThreads保持一致

enableLookups ”设置为“false”来关闭DNS 查询。当DNS查询被关闭时,request.getRemoteHost()将返回包含远程客户IP地 址的字符串。

noCompressionUserAgents=“gozilla, traviata” 对于以下的浏览器,不启用压缩

compressableMimeType=“text/html,text/xml” 压缩类型

SSLHostConfig 设置证书,正常不需要设置

文章来源:https://blog.csdn.net/u010741032/article/details/135161996
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。