一、Tomcat 运行模式介绍

 

        Tomcat Connector(Tomcat连接器)有 bio、nio、apr 三种运行模式,那么这三种运行模式有什么区别呢,我们又如何选择Tomcat Connector的运行模式来提高Tomcat的运行性能呢?

 

 

1.1 bio模式

        bio(blocking I/O),顾名思义,即阻塞式 I/O 操作,表示 Tomcat 使用的是传统的 Java I/O 操作 (即 java.io 包及其子包)。Tomcat 在默认情况下,就是以 bio 模式运行的。遗憾的是,就一般而言,bio 模式是三种运行模式中性能最低的一种。

 

 

1.2 nio模式

        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) 更好的并发运行性能。

 

 

1.3 apr模式   

        apr(Apache Portable Runtime/Apache可移植运行时),是 Apache HTTP 服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

 

 

1.4 怎么查看Tomcat运行模式

        Tomcat 启动完成后,在底部会看到运行模式字样。如下图:http-apr-9090

 

 

总结:

1、性能排序:bio<nio <apr

2、Tomcat从7.30版本开始,默认都是apr模式,所以不用去学习如何修改模式

 

二、内存优化

 

1、JVM相关的参数含义

-server:表示启用 JDK的 server 版本;

-Xms:堆的最小内存(一般与Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能);

-Xmx:堆的最大内存;

-Xmn:堆的新生代大小;

-XX:PermSize:永久代大小;

-XX:MaxPermSize:永久代大小最大值;

 

 

2、Tomcat指定JVM参数

        Linux下修改 TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在 CLASSPATH = 下面(有的时候图方便,直接放在文件的第二行):

JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn512m -XX:PermSize=512M -XX:MaxPermSize=1024m " 

windows 下修改 TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在 set CLASSPATH = 下面(有的时候图方便,直接放在文件的第二行):

set JAVA_OPTS=-server -Xms2048m -Xmx2048m -Xmn512m  -XX:PermSize=512M -XX:MaxPermSize=1024m  

 

3、xmx到底要设置多大合适?

 

  1. 这里需要测量出Java年老代存活对象大小!!!
  2. JVM 内存大小设置公式:
  3. 首先用工具测量出FullGC后,年老代活存对象的大小(多次取平均)。
  4. 年老代内存=年老代存活对象的2-3倍
  5. 年轻代内存=年老代存活对象的1-1.5倍
  6. 堆内存xmx=xms=年老代+年轻代
  7. 永久代=年老代存活对象的1.2-1.5倍
  8. 总内存设置不能超过物理内存的80%

 

4、Java年老代存活对象的测量

        JVM参数中添加GC日志,GC日志中会记录每次FullGC之后各代的内存大小,观察老年代GC之后的空间大小。可观察一段时间内的FullGC之后的内存情况,根据多次的FullGC之后的老年代的空间大小数据来预估FullGC之后老年代的存活对象大小(取平均值)

 

 

5、如何触发FullGC ?

        使用jmap工具可触发FullGC。

(一)jmap -dump:live,format=b,file=heap.bin <pid> 将当前的存活对象dump到文件,此时会触发FullGC

(二)jmap -histo:live <pid> 打印每个class的实例数目,内存占用,类全名信息.live子参数加上后,只统计活的对象数量。此时会触发FullGC

 

总结:

  1. 参数设置时,注意linux下是有单/双引号的,windows下没有
  2. 参数的设置和顺序没关系
  3. 有的同学可能会把参数加在:startup.sh/bat文件中,也没关系
  4. 堆内存不足,会报:java.lang.OutOfMemoryError: Java heap space 错误
  5. 永久代内存不足,会报:java.lang.OutOfMemoryError: PermGen space 错误
  6. 堆内存xmx=年轻代大小xmn+年老代大小

 

总结:

        在内存相对紧张的情况下,可以按照上述的方式来进行内存的调优。内存相对宽裕的时候,可以相对给服务多增加一点内存,可以减少GC的频率,GC的耗时相应会增加一些。一般要求低延时的可以考虑多设置一点内存,对延时要求不高的,可以按照上述方式设置较小内存。

 

 

------------END--------------