总结之JVM调优(三)——Tomcat优化及代码优化

部署Tomcat8.5

下载
https://tomcat.apache.org/download-80.cgi
上传到linux并解压
添加用户信息
在conf/tomcat-users.xml加入

 <role rolename="manager"/>
  <role rolename="manager_gui"/>
  <role rolename="admin"/>
  <role rolename="admin_gui"/>
  <user username="tomcat" password="tomcat" roles="manager,manager_gui,admin,admin_gui"/>

在这里插入图片描述
将value的内容注释
在这里插入图片描述
启动tomcat
可以登录管理了
在这里插入图片描述

禁用AJP

一般nignx+tomcat的架构,所以用不到AJP协议,所以禁用
在这里插入图片描述

线程池配置

在server.xml中配置

配置方式一

<Connector port="8080" acceptCount="100" maxConnections="200" 
            minSpareThreads="10" maxThreads="200"/>

acceptCount : 请求等待队列大小,当tomcat没有控线线程处理连接请求时,新的请求进入等待队列,默认为100,当超出 acceptCount后,新的请求被拒绝

maxConnections : tomcat能处理的最大并发连接数,超出进入等待队列(acceptCount控制),连接会等待,不能被处理

minSpareThreads :线程池最小线程数,默认为10,该配置指定线程池可以维持的空闲线程数量

maxThreads :线程池最大线程数,默认200,当线程池空闲后会释放,保留minSpareThreads数量

配置方式二

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
 <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

tomcat默认是没有开启的 在server.xml里面 是被注释的需要手动开启

namePrefix:创建的Tomcat线程名字的前缀

minSpareThreads :线程池最小线程数,默认为4

maxThreads :线程池最大线程数 默认为150
Executor实现的线程池,可以有更丰富的配置 如下

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
          deamon="true"  maxThreads="150" minSpareThreads="4"
            maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE"
            prestartminSpareThreads="false"/>
 <Connector executor="tomcatThreadPool"
               port="8080" executorTerminationTimeoutMillis ="5000"/>

deamon : 是否守护线程运行,默认为true

maxIdleTime :空闲线程的存活时间 默认为60s,当线程空闲超时后,线程被回收

maxQueueSize :任务队列最大大小,默认为Integer.MAX_VALUE (2147483647 )这太大了 有点不合适

prestartminSpareThreads :是否在tomcat启动时就创建minSpareThreads个线程放入线程池,默认为false

executorTerminationTimeoutMillis :在停止executor时,等待请求处理线程终止的超时时间
maxQueueSize:最大等待线程(超过线程数的线程会等待)

三种运行模式

一、bio(blocking I/O)

即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。是基于JAVA的HTTP/1.1连接器,Tomcat7以下版本在默认情况下是以bio模式运行的。一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。(Tomcat7 或以下,在 Linux 系统中默认使用这种方式)
二、nio(new I/O)

是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。

想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为

protocol=“org.apache.coyote.http11.Http11NioProtocol”
启动后,就可以生效。

利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求

三、apr
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.
必须要安装apr和native,直接启动就支持apr。下面的修改纯属多余,仅供大家扩充知识,但仍然需要安装apr和native
如nio修改模式,修改protocol为org.apache.coyote.http11.Http11AprProtocol

Tomcat8后面版本有nio2,速度更快
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />

调整JVM参数进行优化

修改垃圾收集器

选择CMS收集器
linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入

JAVA_OPTS="-server -Xms2048m -Xmx2048m-Xss512 -XX:+UseConcMarkSweepGC"

windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入

set JAVA_OPTS="-server -Xms2048m -Xmx2048m-Xss512 -XX:+UseConcMarkSweepGC"

调整堆内存大小

8g机器为例

CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms4096m -Xmx4096m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
-Dfile.encoding:默认文件编码
 -server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的
 -Xmx1024m:设置JVM最大可用内存为1024MB
 -Xms1024m:设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
 -Xmn1024m:设置JVM新生代大小(JDK1.4之后版本)。一般-Xmn的大小是-Xms的1/2左右,不要设置的过大或过小,过大导致老年代变小,频繁Full GC,过小导致minor GC频繁。如果不设置-Xmn,可以采用-XX:NewRatio=2来设置,也是一样的效果
 -XX:NewSize:设置新生代大小
 -XX:MaxNewSize:设置最大的新生代大小
 -XX:PermSize:设置永久代大小
 -XX:MaxPermSize:设置最大永久代大小
 -XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代)。设置为 4,则年轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5
 -XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。需要注意的是,设置了 -XX:MaxTenuringThreshold,并不代表着,对象一定在年轻代存活15次才被晋升进入老年代,它只是一个最大值,事实上,存在一个动态计算机制,计算每次晋入老年代的阈值,取阈值和MaxTenuringThreshold中较小的一个为准。
响

应和吞吐量提高

JVM 字节码

javap

Jmeter压力测试工具安装及使用教程

https://www.cnblogs.com/monjeo/p/9330464.html

代码优化

尽可能使用局部变量

调用方法时传递的参数以及在调用中创建临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容都没了,不需要额外的垃圾回收。
在这里插入图片描述
**加粗样式**
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章