JVM优化
JVM优化
参考
JVM优化
设置并行垃圾回收器
注意:具体的参数可能在不同的JDK版本中有差异
#年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512M
JAVA_OPTS="‐XX:+UseParallelGC ‐XX:+UseParallelOldGC ‐Xms64m ‐Xmx512m ‐ XX:+PrintGCDetails ‐XX:+PrintGCTimeStamps ‐XX:+PrintGCDateStamps ‐ XX:+PrintHeapAtGC ‐Xloggc:../logs/gc.log"
调整堆年代大小
先来复习下堆的组成:
JVM占用的内存=metaspace+Heap
Heap = {Old + NEW = { Eden , from, to } }
具体调优:
- ms/mx:定义YOUNG+OLD段的总尺寸,ms为JVM启动时YOUNG+OLD的内存大小;mx为最大可占用的YOUNG+OLD内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
- NewSize/MaxNewSize:定义YOUNG段的尺寸,NewSize为JVM启动时YOUNG的内存大小;MaxNewSize为最大可占用的YOUNG内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
- SurvivorRatio:设置Survivor空间和Eden空间的比例
具体配置示例:
JAVA_OPTS="
‐XX:+UseParallelGC
‐XX:+UseParallelOldGC
‐Xms128m ‐Xmx1024m
‐ XX:NewSize=64m
‐XX:MaxNewSize=256m
‐XX:+PrintGCDetails
‐ XX:+PrintGCTimeStamps
‐XX:+PrintGCDateStamps
‐XX:+PrintHeapAtGC
‐ Xloggc:../logs/gc.log" //将GC打印信息输出到文件
设置G1垃圾回收器
G1垃圾收集是JDK推荐使用的,且配置相对简单,只需要配置3个:开启G1垃圾收集器、设置堆的最大内存和最大的停顿时间,其他的比如newSize等最好让G1收集器自动去配
JAVA_OPTS="
‐XX:+UseG1GC //使用G1垃圾收集器
‐XX:MaxGCPauseMillis=100 //配置最大停顿时间
‐Xms128m ‐Xmx1024m //设置最大堆内存
‐ XX:+PrintGCDetails //下面的都是打印配置
‐XX:+PrintGCTimeStamps
‐XX:+PrintGCDateStamps
‐ XX:+PrintHeapAtGC
‐Xloggc:../logs/gc.log
Tomcat优化
tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对tomcat的优化也变得非常重要。 对于tomcat的优化,主要是从2个方面入手:
- 1.tomcat自身的配置
- 2.tomcat所运行的jvm虚拟机的调优。
总结来说:
tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具JMeter和日志分析gceasy.io来看gc的情况。再帮我我们做出决策应该调整
tomcat配置优化
- 修改配置以登陆tomcat系统
1.修改conf/tomcat-users.xml文件,添加如下配置
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
2.修改webapps/manager/META‐INF/context.xml,注释如下内容
#将<Valve>的内容注释掉
<Context antiResourceLocking="false" privileged="true" >
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/></Context>
3.进入tomcat并点击Server.status,输入配置的用户名和密码即可进入系统
1.禁用AJP链接
AJP(Apache JServer Protocol) AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省 SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且 在多个请求和响应周期过程会重用连接。在服务状态页面中可以看到"ajp-nio-8009",默认状态下会启用AJP服务,并且占用8009端口。
我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。
修改conf下的server.xml文件:
2.配置线程池
在tomcat中用户的每一个请求都是一个线程,使用线程池将提高性能。
3个关键参数:最大线程池maxThreads,初始线程池minSpareThreads和最大等待队列,通过调整这3个参数来调试出最优性能,具体的值需要根据具体的情况而定,可以多做几次调试然后用JMeter来参考数据对比找出最优配置。
修改server.xml文件
1.配置executor,打开Executor的注释并添加如下配置
<Executor name="tomcatThreadPool" namePrefix="catalina‐exec‐" maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>
<!--
参数说明:
maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 1000,根据硬件设施和业
务来判断
minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化 minSpareThreads 的
参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
maxQueueSize,最大的等待队列数,超过则拒绝请求
-->
2.在Connector中指向刚才配置的Executor
<Connector excutor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
3.使用不同的运行模式来提升性能
tomcat的三种运行模式
-
- bio 默认的模式,性能非常低下,没有经过任何优化处理和支持.
-
- 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)更好的并发运行性 能。
-
- apr 安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.
tomcat7推荐使用nio,在tomcat8中有最新的nio2,速度更快,建议使用nio2
配置nio2:
直接将protocol HTTP/1.1改为org.apache.coyote.http11.Http11Nio2Protocol
<Connector excutor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
4.设置tomcat的JVM参数进行优化
在tomcat的bin目录下的Catalina.sh脚本末尾增加JVM运行参数
本博客为Swagger-Ranger的笔记分享,文章会持续更新
文中源码地址: https://github.com/Swagger-Ranger
欢迎交流指正,如有侵权请联系作者确认删除: liufei32@outlook.com
posted on 2019-04-14 21:48 Swagger-Ranger 阅读(380) 评论(0) 编辑 收藏 举报