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的三种运行模式

    1. bio 默认的模式,性能非常低下,没有经过任何优化处理和支持.
    1. 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)更好的并发运行性 能。
    1. 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

原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10707288.html