欢迎各位大牛指教

jvm调优

1.运行模式
一般tomcat1.7默认都是bio模式,性能非常低,没有经过任何优化处理和支持,一个线程一个请求。缺点:并发量高时,线程数较多,浪费系统资源
而1.4之后支持NIO模式,比传统I/O操作(bio)更好的并发运行性能。利用Java的异步IO处理,可以通过少量的线程处理大量的请求
步骤:
1.安装APR
下载 apr-1.5.2.tar:http://archive.apache.org/dist/apr/apr-1.7.0.tar.gz ,这个版本亲测比较好点
yum -y install autoconf // 安装autoconf
yum -y install libtool // 安装libtool
yum -y install openssl openssl-devel // 安装openssl
tar xvzf apr-1.7.0.tar.gz // 解压apr-1.7.0.tar.gz
cd apr-1.7.0
./configure --prefix=/usr/apr // 指定安装到/usr/apr目录
这一步可能报错rm: cannot remove 'libtoolT': No such file or directory
打开configure文件
找到RM='$RM'修改为RM='$RM -f' 即可 这个文件内容很多,可以下载到本地查找更改后替换
make
make install
cd /usr/tomcat/apache-tomcat-7.0.59/bin // 切换目录,在tomcat/bin目录下找到tomcat-native.tar.gz;
tar xvzf tomcat-native.tar.gz // 解压tomcat-native.tar.gz
cd /usr/tomcat/apache-tomcat-7.0.59/bin/tomcat-native-1.1.32-src/jni/native // 切换目录
./configure --with-apr=/usr/apr --with-java-home=/usr/java/jdk1.7.0_72 --with-ssl=/usr/bin --prefix=/usr/apr // 指定之前安装的目录
make
make install
修改环境变量
vi /etc/profile
在最后增加
export LD_LIBRARY_PATH=/usr/apr/lib
source /etc/profile // 使配置生效
tomcat server.xml文件中修改
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"
        connectionTimeout="20000" redirectPort="8443"/>
开启nio模式,重启
完成,网上有的说1.8不需配置默认支持,但是并没有,。。。有时间可以再尝试下
2.线程池开启
tomcat server.xml文件中
把Executor节点注释打开,同时在Connector中添加executor=Executor的name
在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能;线程池有很多参数可以配置调优,可以去了解下,以下只解释几个核心参数:
 
maxThreads,
最大线程数,tomcat能创建来处理请求的最大线程数
 
maxSpareTHreads,
最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若空闲时间大于最大空闲时间,则回收,小于则继续存活,等待被调度。
 
minSpareTHreads
最小空闲线程数,无论如何都会存活的最小线程数
 
acceptCount
最大等待队列数 ,请求并发大于tomcat线程池的处理能力,则被放入等待队列等待被处理。
 
maxIdleTime
最大空闲时间,超过这个空闲时间,且线程数大于最小空闲数的,都会被回收   
3.连接器
实际就是对 Connector 进行扩展
<Connector port="8080"protocol="HTTP/1.1" 
          connectionTimeout="20000" 
          redirectPort="8443" /> 
这是网上找的一个配置可以参考下,具体参数可以去了解下;
URIEncoding=”UTF-8”
使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译
maxSpareThreads
maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。
minSpareThreads
最小备用线程数,tomcat启动时的初始化的线程数。
enableLookups
这个功效和Apache中的HostnameLookups一样,设为关闭。
 connectionTimeout
connectionTimeout为网络连接超时时间毫秒数。
 maxThreads
maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。
 acceptCount
acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection
maxProcessors与minProcessors
在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。
通常Windows是1000个左右,Linux是2000个左右。
还有许多其他的参数不一一详解,可以主动去了解下
 
4.禁用APJ连接
AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接;我们是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用
5.jvm调优
堆栈概念:jvm内存分配
Tomcat 的启动参数位于tomcat的安装目录\bin目录下catalina.sh文件(Windows下catalina.bat)。
在文件结尾换行加入参数
export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
参数解读:
-server:
tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以 server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量
-Xms–Xmx:
JVM内存设置,把Xms与Xmx两个值设成一样是最优的做法,在设这个最大内存即Xmx值时需先测试
出现jdk版本说明参数可用,否则
–Xmn
设置年轻代大小为512m。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8,大小可以根据自己系统实际使用情况配置,但注意符合设置规则
-Xss
设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,否则容易导致OOM。
XX:+AggressiveOpts
作用如其名(aggressive),启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)
XX:+UseBiasedLocking
看到lock这个关键字就知道跟锁有关,启用一个线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。
 -XX:PermSize=128M-XX:MaxPermSize=256M
 
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
 
在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。
 
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
 
那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;
 
四分之一是1024MB,这就是MaxPermSize默认大小。
-XX:+DisableExplicitGC
在 程序代码中不允许有显示的调用”System.gc()”,这样会导致系统响应时间严重降低;
-XX:+UseParNewGC
对年轻代采用多线程并行回收
-XX:+UseConcMarkSweepGC
使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒
-XX:MaxTenuringThreshold
设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一 个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。这里需要大家去了解下新生代、老年代的具体概念结合自己系统的使用配置。
-XX:+CMSParallelRemarkEnabled
使用UseParNewGC 的情况下, 尽量减少 mark 的时间
-XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。
-XX:LargePageSizeInBytes
指定 Java heap的分页页面大小
-XX:+UseFastAccessorMethods
get,set 方法转成本地代码
-XX:+UseCMSInitiatingOccupancyOnly
只有在 oldgeneration 在使用了初始化的比例后concurrent collector 启动收

posted @ 2021-01-28 16:35  夏沫秋至  阅读(101)  评论(0编辑  收藏  举报