系统优化怎么做-Tomcat优化
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新
- 博客园:http://www.cnblogs.com/changsong/
- 知乎专栏:https://zhuanlan.zhihu.com/youhua
- 全网私活,免费订阅: http://www.zsihuo.com
在这里我会从基于J2EE系统及互联网架构方面,来谈谈系统优化的各个方面,干货满满,欢迎订阅及关注!
前言
Tomcat作为Web应用的服务器,目前绝大多数公司都是用其作为应用服务器的,应用服务器的执行效率会影响系统执行,这里会讲Tomcat怎样进行配置能提高处理性能。另外必须提到对应的JVM参数的优化的一些经验。
Tomcat运行模式
分3种模式: bio,nio,apr 一般使用nio模式
bio效率低,apr对系统配置有一些比较高的要求
确认Tomcat的运行模式
配置文件 server.xml
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="1024"
minSpareThreads="512"
prestartminSpareThreads="true" />
关键配置
maxThreads
最大线程数, 默认是200
minSpareThread
最小活跃线程数, 默认是25
maxQueueSize
最大的等待队列个数,超过则请求拒绝默认值是Integer.MAX_VALUE ,一般不改变。在某些紧急状态修复问题需要调整
连接器(Connector)优化
Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以Connector的优化是重要部分。默认情况下 Tomcat只支持200线程访问,超过这个数量的连接将被等待甚至超时放弃,所以我们需要提高这方面的处理能力。
nio配置- server.xml
<Connector port="14081" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
executor="tomcatThreadPool"
URIEncoding="UTF-8"
compression="on"
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="14443" />
影响性能配置
- protocol
org.apache.coyote.http11.Http11Protocol- 阻塞式的Java连接器org.apache.coyote.http11.Http11NioProtocol- 不阻塞Java连接器org.apache.coyote.http11.Http11AprProtocol- APR / native 连接器
选择不阻塞ava连接器
- enableLookups
若是你想request.getRemoteHost()的调用履行,以便返回的长途客户端的实际主机名的DNS查询,则设置为true。设置为false时跳过DNS查找,并返回字符串的IP地址(从而提高性能)。默认场景下,禁用DNS查找
- compression
设置成on,开启压缩
禁用AJP链接器
使用Nginx+tomcat的架构,用不着AJP协议,所以把AJP连接器禁用
server.xml注释掉一下配置
<Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
优化JVM
/bin/catalina.sh
修改JAVA_OPTS参数
这里需要参照机器配置,对JVM进行参数优化
JDK1.7
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:+DisableExplicitGC"
JDK1.8
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:+DisableExplicitGC"
1.8 版本中已经没有PermSize、MaxPermSize
JAVA8里对metaspace可以在小范围自动扩展永生代避免溢出。
参数说明
- -Djava.awt.headless
没有设备、键盘或鼠标的模式。
- -Dfile.encoding
设置字符集
- -server
vm的server工作模式,对应的有client工作模式。使用“java -version”可以查看当前工作模式
- -Xms1024m
初始Heap大小,使用的最小内存
- -Xmx1024m
Java heap最大值,使用的最大内存
经验: 设置Xms大小等于Xmx大小
- -XX:NewSize=512m
表示新生代初始内存的大小,应该小于 -Xms的值
- -XX:MaxNewSize=1024M
表示新生代可被分配的内存的最大上限,应该小于 -Xmx的值
- -XX:PermSize=1024m
设定内存的永久保存区域,内存的永久保存区域,VM 存放Class 和 Meta 信息,JVM在运行期间不会清除该区域
程序加载很多class情况下,超出PermSize情况下
JDK1.7会抛出java.lang.OutOfMemoryError: PermGen space异常
JDK1.8下会抛出 ERROR: java.lang.OutOfMemoryError: Metadata space 异常
- -XX:MaxPermSize=1024m
设定最大内存的永久保存区域
经验: 设置PermSize大小等于MaxPermSize大小
- -XX:+DisableExplicitGC
自动将System.gc()调用转换成一个空操作,即应用中调用System.gc()会变成一个空操作,避免程序员在代码里进行System.gc()这种危险操作。System.gc() 除非是到了万不得也的情况下不使用,都交给JVM吧
其他优化参数
- -XX:SurvivorRatio=2
年轻代中Eden区与Survivor区的大小比值
- -XX:ReservedCodeCacheSize=256m
保留代码占用的内存容量,无大的影响
- -Xss1024k
单个线程堆栈大小值,减少这个值可以生成更多线程,操作系统对于一个进程内的线程数是有限制的,经验值在3000-5000左右
- -XX:+CMSParallelRemarkEnabled
CMS 垃圾回收算法,对响应时间的重要性需求 大于 对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用
- -XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。
- -XX:+UseCMSInitiatingOccupancyOnly
在FULL GC的时候, 对年老代的压缩。CMS是不会移动内存的, 因此这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片。
- -XX:CMSInitiatingOccupancyFraction=60
使用cms作为垃圾回收, 使用60%后开始CMS收集
- -XX:+UseGCOverheadLimit
用来限制使用内存,如果不做控制,可能会报出
java.lang.OutOfMemoryError: GC overhead limit exceeded
- -XX:+UseConcMarkSweepGC
使用CMS内存收集
- -XX:+UseParNewGC
设置年轻代为并行收集
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=/x/dump_tomcat.hprof
JVM会在遇到OutOfMemoryError时拍摄一个“堆转储快照”,并将其保存在一个文件中。
- -Xloggc:/xx/gc_tomcat.log
gc的日志,如果该日志中出现频繁的Full GC就是有相关的系统问题,如果很少,说明暂时还算正常
- -XX:+PrintGCDateStamps
输出GC的时间戳(以基准时间的形式)
- -XX:+PrintGCDetails
输出GC的日志格式
- -Dnetworkaddress.cache.ttl=60
- -Dsun.net.inetaddr.ttl=60
设置DNS缓存时间
- -DautoStartup=false
- -Dsun.net.client.defaultConnectTimeout=60000
连接建立超时时间
- -Dsun.net.client.defaultReadTimeout=60000
内容获取超时设置
- -Djmagick.systemclassloader=no
是否生成缩略图的一个框架的配置
- -Djava.security.egd=file:/dev/./urandom
最佳实践
export JAVA_OPTS="-server -showversion -Xms2000m -Xmx2000m -Xmn500m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:SurvivorRatio=2 -XX:ReservedCodeCacheSize=256m -Xss1024k -Djava.awt.headless=true -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:+UseGCOverheadLimit -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tomcat_path/logs/dump_tomcat.hprof -Xloggc:/tomcat_path/logs/gc_tomcat.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCDetails -Dnetworkaddress.cache.ttl=60 -Dsun.net.inetaddr.ttl=60 -DautoStartup=false -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8"
常见JVM异常
- java.lang.OutOfMemoryError: Java heap space —-JVM Heap(堆)溢出
JVM 在启动的时候会自动设置 JVM Heap 的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。可以利用 JVM提供的 -Xmn -Xms -Xmx 等选项可进行设置。Heap 的大小是 Young Generation 和 Tenured Generaion 之和。在 JVM 中如果 98% 的时间是用于 GC,且可用的 Heap size 不足 2% 的时候将抛出此异常信息。
解决方法:手动设置 JVM Heap(堆)的大小。
- java.lang.OutOfMemoryError: PermGen space —- PermGen space溢出。
jdk1.8 抛出 ERROR: java.lang.OutOfMemoryError: Metadata space 异常
PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域。为什么会内存溢出,这是由于这块内存主要是被 JVM 存放Class 和 Meta 信息的,Class 在被 Load 的时候被放入 PermGen space 区域,它和存放 Instance 的 Heap 区域不同,sun 的 GC 不会在主程序运行期对 PermGen space 进行清理,所以如果你的 APP 会载入很多 CLASS 的话,就很可能出现 PermGen space 溢出。
解决方法: 手动设置 MaxPermSize 大小
- java.lang.StackOverflowError —- 栈溢出
栈溢出了,JVM 依然是采用栈式的虚拟机。函数的调用过程都体现在堆栈和退栈上了。调用构造函数的 “层”太多了,以致于把栈区溢出了。通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K 的空间(这个大约相当于在一个 C 函数内声明了 256 个 int 类型的变量),那么栈区也不过是需要 1MB 的空间。通常栈的大小是 1-2MB 的。
通常递归也不要递归的层次过多,很容易溢出。
思考题
1. 线上应用系统出现问题,怎么快速定位系统哪块资源问题
系统优化怎么做-Tomcat优化的更多相关文章
- 系统优化怎么做-JVM优化之开篇
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...
- 系统优化怎么做-JVM优化之VisualVM
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...
- 系统优化怎么做-SQL优化
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...
- Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法
Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法 java.lang.OutOfMemoryError: Java heap sp ...
- tomcat优化实例
———————————————————————————————————— 一.运行模式优化 修改tomcat运行模式为nio<Connector port="80" prot ...
- tomcat优化和JVM修改内存
Tomcat中的线程池(APR和ThreadPool) 2. 在Connector中指定使用共享线程池: <Connector executor="tomcatThreadPool&q ...
- tomcat优化(转)
tomcat优化 Activiti 分享牛 2017-02-08 1132℃ 本文重点讲解tomcat的优化. 基本优化思路: 1. 尽量缩短单个请求的处理时间. 2. ...
- Tomcat学习总结(3)——Tomcat优化详细教程
Tomcat是我们经常使用的 servlet容器之一,甚至很多线上产品都使用 Tomcat充当服务器.而且优化后的Tomcat性能提升显著,本文从以下几方面进行分析优化. 一.内存优化 默认情况下To ...
- Tomcat优化详细教程
Tomcat是我们经常使用的 servlet容器之一,甚至很多线上产品都使用 Tomcat充当服务器.而且优化后的Tomcat性能提升显著,本文从以下几方面进行分析优化. 一.内存优化 默认情况下To ...
随机推荐
- 浅谈移动端中的视口(viewport)
在 PC 端,视口指的是浏览器的可视区域,其宽度和浏览器窗口的宽度保持一致.在 CSS 标准文档中,视口也被称为初始包含块,它是所有 CSS 百分比宽度推算的根源,给 CSS 布局限制了一个最大宽度. ...
- [ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.8:unpack (unpack) on project sq-integral-web: Unable to find artifact.
1.问题描述 项目maven打包报上述错误, 但是小伙伴运行好使. 2.问题解决 是idea工程编码(gbk)和项目编码(utf-8)不一致 idea->file->Other Setti ...
- 修改vue的配置项支持生产环境下二级目录访问的方法
本文主要记录如何配置vue的打包文件配置项,使打包后的文件可以支持二级目录的访问. 1.常规打包 在实际的项目中,我们通常都使用 npm run build 直接打包文件后丢到服务器上访问 打包后的文 ...
- 05_zookeeper的ACL
[ACL概述] ACL:access control Lists,权限控制. * 针对节点可以设置相关的读写等权限,目的是为了保障数据安全性. * 权限permissions可以指定不同的权限范围以及 ...
- push本地代码到github发生错误的解决办法
有一天,我在github上编写好了README.md这个文件,接着发现本地有段代码忘记上传了,于是熟练的输入git add . git commit -m "modify",以 ...
- <meta name="renderer" content="webkit">
<meta name="renderer" content="webkit"> 当前国内的大部分主流浏览器(如360)基本都是双核浏览器,所谓双核即 ...
- $.each遍历JSON字符串和 Uncaught TypeError: Cannot use 'in' operator to search for '156错误
现在页面和后端交互都流行使用json了 自己记录一下解析字符串的方法,要不老是忘记!!!! success: function (data) { //data是后台传过来的字符串 $.each(JS ...
- python 替换指定目录下,所有文本字符串
网页保存后,会把js文件起名为.下载,html里面的引用也会有,很不美观,解决方案:用python替换字符串 import os import re """将当前目录下所 ...
- Android已上线应用开源分享中(第二季)
昨天和大家分享了我Android上线的第一个应用,大家还是挺支持的,很高兴,虽然作品没有那么高大上,但是很是有了一点小小的成就感,所以打算继续开源我上线的一些应用,和大家一起交流一下. 我这个作品是一 ...
- SQL Server 有序GUID,SequentialGuid,
问题描述 有序的GUID性能对比,堪比自增ID integer 一个大神告诉我NEWSEQUENTIALID() 在数据迁移的时候会有问题(感谢大神指点),所以我就深挖一下这个函数. 关于NEWSEQ ...