Tomcat:配置连接方式

安装Tomcat后,默认已经不错了,围绕配置的优化一般也就两个方面:

  1. 调优 JVM 启动的内存大小
  2. 优化连接方式

Tomcat 的连接方式

  • JIO:普通的Java io 处理。tomcat默认的 IO 连接方式。

  • NIO:java new io正理,有非阻塞 IO 特性。使用nio修改下

    1
    <Connector protocol="org.apache.coyote.http11.Http11NioProtocol">
  • Apr: 使用C语言写的一种连接器。需要安装 APR 和 Native,然后修改 Connector 的 protocol

    1
    <Connector protocol="org.apache.coyote.http11.Http11AprProtocol">

这三种方式,看网上所有人都如是说说 Apr > nio & jio,甚 至把 jio 鄙视的一文不值,当初我也以为是这样,毕竟C更贴近底层一些,而 nio 名字听起来也比 io 吓人,所以就把这些都装上去尝试了一下,结果发现这些不相上下,特别是处理小文件方面比 apr, nio 要快的多。忽然有种被忽悠的感觉,听说快的原因如下:

  1. apr 虽然是更接近底层的c写的,但每次都要执行很多,jio 编译成码流后,可以省很多性能。
  2. nio 处理文件由于有非阻塞 io 的特性,会额外增加不少开销,并不是万能的快。
阅读更多

Tomcat:JVM内存设置

开发的时候使用 Tomcat 大都使用的默认配置,很少性能调优,主要可能由于:

  1. 懒:如果是开发环境确实没什么必要,仅仅是大量压力的时候需要调下,而且默认的设置也是调过很多次的。虽然来是最优也能兼容很大情况。
  2. 不知道怎么去调试内存。

如果是在生产环境,也很难搞,因为生生环境有真实用户,不太好进行压测。所以要知道生产环境需要启动分配多少heap,多少stack多少prem都是不好说的。

最近研究下,能否通过本地开发环境启动时的配置数据加测试数据,和生产环境的用户数和并发量简单算出一个合适的启动参数呢?但也是不准确的,所以可以慢慢观察。

JVM 的启动参数

  • -Xms 限制Java堆的大小最小
  • -Xmx 限制Java堆的大小最大 当程序中请求一分配一个内存时、空间不够就会报Out Of Memory错误
    如果设置成一样大,则不会去扩展,这点很重要
  • -XX:+HeapDumpOnOutOfMemoryError 出现内存错误时dump出一个heap的快照以便分析
    这个文件可能通过Eclipse插件:MAT打开分析
  • -Xss : 栈容量 一般不会用到,如果设的小的话,会经常报StackOverflowError,栈桢超出
  • -XX: PermSize 给方法堆分配的空间
  • -XX:MaxPermSize 给方法堆分配的空间
    PermSize一般来说不必太在意,GC时一般不会去回收这部分空间,(当然各JVM版本不同,处理时也不不相同)
阅读更多