前言

  在这里告诫一下那些感觉自己啥都会的朋友们,其实你会的可能只是皮毛,不要感觉这个东西以前已经做过了,就不想去做了

  其实你还远没有达到精通的地步,遇到以前做过的东西,也要用心的再去做一遍,你可能会从中学习到以前没学到的知识点

一、Tomcat调优主要内容如下:

  1、增加最大连接数

    配置过Tomcat的同学,应该都知道这个配置,好多地方也建议你,把这个配置调到最大(1000),如果服务器本身的性能允许的话
  2、调整工作模式

    tomcat下工作模式有三种,bio   nio   apr

    bio (blocking I/O):

      即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。
      一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源。

      tomcat7及以下的版本默认的就是bio模式,在server.xml中的配置就是protocol="HTTP/1.1"

    nio (new I/O):

      Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。

      它拥有比传统I/O操作(bio)更好的并发运行性能。
      利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求。

      tomcat8 及以上的版本默认就是这种模式,不需要额外的更改,如果tomcat7想用这种模式的话,就需要把protocol="HTTP/1.1"

      更改为: org.apache.coyote.http11.Http11NioProtocol即可

    apr (Apache Portable Runtime/Apache可移植运行时):

      Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。

      Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

      要想Tomcat支持APR的工作模式,就需要提前安装好APR和native,下面会详细介绍这两个工具的安装
  3、启用gzip压缩

    一般情况下,Tomcat不要这样做,为啥呢?因为前面有nginx,nginx做了就可以了
  4、调整JVM内存大小

    先简单的说下jvm的作用,大家都知道(也有不知道的,嘿嘿),Java源代码(.java文件)经由源码编译器生成.class字节码文件,那么剩余的程序运行之后一系列

    过程都是由jvm去完成的,所以可以得知jvm的重要性;在运维过程中jvm最容易出问题就是内存泄漏,常见的内存泄漏有两种:

    4.1 Java.lang.OutOfMemoryError: PermGen(永久代) space

      这块内存主要是被JVM存放Class、方法和属性值,Class在被Loader时就会被放到PermGen space中,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
      这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小
      超过了jvm默认的大小(4M)那么就会产生此错误信息了。
      解决方法: 手动设置MaxPermSize大小
      建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

    4.2 java.lang.OutOfMemoryError: Java heap(堆内存) space

      主要存放对象,垃圾收集器就是回收这些对象,然后是根据GC算法进行回收

      这种内存溢出为堆内存溢出,其实跟上面那种溢出方式大同小异,都可以通过调整Tomcat的jvm参数来解决,具体的参数设置应该如下:

      -Xms:初始堆的大小,应不大于物理内存的80%

      -Xmx:最大堆的大小,应不大于物理内存的80%,这两个值应保持一致

      -XX:PermSize  这个就是上面第一种错误设置的值,大小应不高于物理内存的7%

       -XX:MaxPermSize   设置的最大的permsize的值应不大于物理内存的15%

      服务器为64位、2G内存: JAVA_OPTS='-server -Xms1024m -Xmx1536m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m'

    4.3 OutOfMemoryError: unable to create new native thread.

      这种错误不太常见,但也是有可能,出现这种问题就稍微比较麻烦了,只是单纯的调大jvm参数,只会适得其反,这里我不过多的阐述,

      只是告诫大家,出现这种错误的时候,不要加大jvm参数,要调小jvm参数,具体的标准,请自行查阅文章

      这里说一下如果是其它的bug导致的内存泄漏,就要通过jstack、jmap、jstat自带的工具分析问题,定位到相关代码,让开发解决。
  5、作为Web时,动静分离

    使用Apache或Nginx处理静态资源文件,Tomcat处理动态资源文件。因为Tomcat处理静态资源能力远不如Apache、Nginx,所以可以有效提高处理速度。
  6、尽量使用较新JDK版本

二、APR、native的安装

  APR下载:http://apr.apache.org/download.cgi

Tomcat调优详解的更多相关文章

  1. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

  2. Spark Streaming性能调优详解

    Spark Streaming性能调优详解 Spark  2015-04-28 7:43:05  7896℃  0评论 分享到微博   下载为PDF 2014 Spark亚太峰会会议资料下载.< ...

  3. Spark Streaming性能调优详解(转)

    原文链接:Spark Streaming性能调优详解 Spark Streaming提供了高效便捷的流式处理模式,但是在有些场景下,使用默认的配置达不到最优,甚至无法实时处理来自外部的数据,这时候我们 ...

  4. JVM性能调优详解

    前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备.这篇文章带领大家学习JVM性能调优的知识. 性能调优 性能调优包含多个层次,比如:架构调优.代码 ...

  5. [转帖]JVM性能调优详解

    JVM性能调优详解 https://www.cnblogs.com/secbro/p/11833651.html 应该是 jdk8 以前的方法 貌似permsize 已经放弃这一块了. 前面我们学习了 ...

  6. Java生产环境下性能监控与调优详解

    1:JVM字节码指令与 javapjavap <options> <classes>cd monitor_tuning/target/classes/org/alanhou/m ...

  7. Mysql运行状态查询命令及调优详解

    (转载自点击打开链接) MySQL运行状态及调优(一) 一.查看MySQL运行情况SHOW STATUS; 二.查看INNODB数据库引擎运行状态SHOW ENGINE INNODB STATUS; ...

  8. 7.JVM调优-方法区,堆,栈调优详解

    通常我们都知道在堆空间新生代Eden区满了,会触发minor GC, 在老年代满了会触发full GC, 触发full GC会导致Stop The World, 那你们知道还有一个区域满了一会触发Fu ...

  9. Mysql的索引调优详解:如何去创建索引以及避免索引失效

    在正式介绍Mysql调优之前,先补充mysql的两种引擎 mysql逻辑分层 InnoDB:事务优先(适合高并发操作,行锁) MyISAM:性能优先(表锁) 查看使用的引擎: show variabl ...

随机推荐

  1. HTML-参考手册: HTTP 方法:GET 对比 POST

    ylbtech-HTML-参考手册: HTTP 方法:GET 对比 POST 1.返回顶部 1. HTTP 方法:GET 对比 POST 两种最常用的 HTTP 方法是:GET 和 POST. 什么是 ...

  2. 3. 初识jmeter及JDK安装

    jmeter 介绍 Apache JMeter™应用程序是开源软件,100%纯Java应用程序,旨在加载测试功能行为和测量性能.它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能. Jme ...

  3. 【Java多线程系列一】Java实现线程方法

    Java实现线程的两种方法 继承Thread类 实现Runnable接口 它们之间的区别如下: Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用 Thr ...

  4. 剑指offer——44连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  5. 面向对象(三)——组合、多态、封装、property装饰器

    组合.多态.封装.property装饰器 一.组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo(): pass class Bar(): pas ...

  6. vim + ctag + Taglist (转)

    一.ctag 当然,第一步就是要下载它!一条命令搞定: $sudo apt-get install ctags 如果不幸提示找不到软件包ctags,首先你也许应该update一下你的软件源,还不行的话 ...

  7. 前端实现预览ppt,word,xls,pdf文件

    1.前端实现pdf文件在线预览功能 ps:刚好工作上有这个需求,所以到处找了一下处理方案,大家有需要可以试一下这几种方案,找到合适自己的 方式一. pdf文件理论上可以在浏览器直接打开预览但是需要打开 ...

  8. python_django_在views模块中操作状态保持(session)

    什么叫状态保持? 就比如说我们登陆一个网站,登陆之后的当前页面显示的是登陆状态,但是我们要再跳转同一网站的其他页面,则显示的未登录状态,状态保持就是:我们在当前页面登陆后,再访问其他页面时也显示为登陆 ...

  9. Mybatis3中@SelectProvider传递参数

    一.通常情况下我们使用实体类或者vo类来传递参数,这样可以在provider中直接使用#{param}来获取参数 二.在mybatis3.3以下版本只能传递一个参数,所以如果要传递多个参数必须封装成M ...

  10. js 数组排序 根据两个字段属性

    var task = [ {name:"aa", taskLevel:"3",createTime:"2019-12-18"}, {name ...