精华内容
下载资源
问答
  • Tomcat调优面试题(二)

    千次阅读 2017-08-13 11:29:17
    对于Tomcat的处理耗时较长的问题主要有当时的并发量、session数、内存及内存的回收等几个方面造成的。出现问题之后就要进行分析了。  1.关于Tomcat的session数目  这个可以直接从Tomcat的web管理界面去查看...

    一、问题定位--耗时较长

    对于Tomcat的处理耗时较长的问题主要有当时的并发量、session数、内存及内存的回收等几个方面造成的。出现问题之后就要进行分析了。 

    1.关于Tomcat的session数目 

    这个可以直接从Tomcat的web管理界面去查看即可 ;
    或者借助于第三方工具Lambda Probe来查看,它相对于Tomcat自带的管理稍微多了点功能,但也不多 ;

    2.监视Tomcat的内存使用情况 

    使用JDK自带的jconsole可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总量等;
    JDK自带的jvisualvm可以下载插件(如GC等),可以查看更丰富的信息。如果是分析本地的Tomcat的话,还可以进行内存抽样等,检查每个类的使用情况

    3.打印类的加载情况及对象的回收情况 

    这个可以通过配置JVM的启动参数,打印这些信息(到屏幕(默认也会到catalina.log中)或者文件),具体参数如下: 
    -XX:+PrintGC:输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] 
    -XX:+PrintGCDetails:输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] 
    -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用,输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] 
    -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用。输出形式:Application time: 0.5291524 seconds 
    -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用。输出形式:Total time for which application threads were stopped: 0.0468229 seconds 
    -XX:PrintHeapAtGC: 打印GC前后的详细堆栈信息 
    -Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析 
    -verbose:class 监视加载的类的情况 
    -verbose:gc 在虚拟机发生内存回收时在输出设备显示信息 
    -verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息 

    4.添加JMS远程监控 

    对于部署在局域网内其它机器上的Tomcat,可以打开JMX监控端口,局域网其它机器就可以通过这个端口查看一些常用的参数(但一些比较复杂的功能不支持),同样是在JVM启动参数中配置即可,配置如下: 
    -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false 
    -Djava.rmi.server.hostname=192.168.71.38 设置JVM的JMS监控监听的IP地址,主要是为了防止错误的监听成127.0.0.1这个内网地址 
    -Dcom.sun.management.jmxremote.port=1090 设置JVM的JMS监控的端口 
    -Dcom.sun.management.jmxremote.ssl=false 设置JVM的JMS监控不实用SSL 
    -Dcom.sun.management.jmxremote.authenticate=false 设置JVM的JMS监控不需要认证 

    5.专业点的分析工具有 

    IBM ISA,JProfiler等,具体监控及分析方式去网上搜索即可。  

    二、集群方案--负载均衡

    单个Tomcat的处理性能是有限的,当并发量较大的时候,就需要有部署多套来进行负载均衡了。 

    集群的关键点有以下几点: 

    1.引入负载端 

    软负载可以使用nginx或者apache来进行,主要是使用一个分发的功能 
    参考: 
    http://ajita.iteye.com/blog/1715312(nginx负载) 
    http://ajita.iteye.com/blog/1717121(apache负载) 

    2.共享session处理 

    目前的处理方式有如下几种: 
    1).使用Tomcat本身的Session复制功能 
    参考http://ajita.iteye.com/blog/1715312(Session复制的配置) 
    方案的有点是配置简单,缺点是当集群数量较多时,Session复制的时间会比较长,影响响应的效率 
    2).使用第三方来存放共享Session 
    目前用的较多的是使用memcached来管理共享Session,借助于memcached-sesson-manager来进行Tomcat的Session管理 
    参考http://ajita.iteye.com/blog/1716320(使用MSM管理Tomcat集群session) 
    3).使用黏性session的策略 
    对于会话要求不太强(不涉及到计费,失败了允许重新请求下等)的场合,同一个用户的session可以由nginx或者apache交给同一个Tomcat来处理,这就是所谓的session sticky策略,目前应用也比较多 
    参考:http://ajita.iteye.com/blog/1848665(tomcat session sticky) 
    nginx默认不包含session sticky模块,需要重新编译才行(windows下我也不知道怎么重新编译) 
    优点是处理效率高多了,缺点是强会话要求的场合不合适 

    3.小结 

    以上是实现集群的要点,其中1和2可以组合使用,具体场景具体分析吧~ 

    三、JVM优化

    Tomcat本身还是运行在JVM上的,通过对JVM参数的调整我们可以使Tomcat拥有更好的性能。针对JVM的优化目前主要在两个方面: 

    1.内存调优 

    内存方式的设置是在catalina.sh中,调整一下JAVA_OPTS变量即可,因为后面的启动参数会把JAVA_OPTS作为JVM的启动参数来处理。 
    具体设置如下: 
    JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4" 
    其各项参数如下: 
    -Xmx3550m:设置JVM最大可用内存为3550M。 
    -Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 
    -Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 
    -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 
    -XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 
    -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6 
    -XX:MaxPermSize=16m:设置持久代大小为16m。 
    -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 

    2.垃圾回收策略调优 

    垃圾回收的设置也是在catalina.sh中,调整JAVA_OPTS变量。 
    具体设置如下: 
    JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100" 

    具体的垃圾回收策略及相应策略的各项参数如下: 
    串行收集器(JDK1.5以前主要的回收方式) 
    -XX:+UseSerialGC:设置串行收集器 
    并行收集器(吞吐量优先) 
    示例: 
    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 

    -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。 
    -XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。 
    -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集 
    -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。 
    -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。 
    并发收集器(响应时间优先) 
    示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC 
    -XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。 
    -XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。 
    -XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。 
    -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片 

    3.小结 

    在内存设置中需要做一下权衡 
    1)内存越大,一般情况下处理的效率也越高,但同时在做垃圾回收的时候所需要的时间也就越长,在这段时间内的处理效率是必然要受影响的。 
    2)在大多数的网络文章中都推荐 Xmx和Xms设置为一致,说是避免频繁的回收,这个在测试的时候没有看到明显的效果,内存的占用情况基本都是锯齿状的效果,所以这个还要根据实际情况来定。 

    四、Server.xml的Connection优化

    Tomcat的Connector是Tomcat接收HTTP请求的关键模块,我们可以配置它来指定IO模式,以及处理通过这个Connector接受到的请求的处理线程数以及其它一些常用的HTTP策略。其主要配置参数如下: 

    1.指定使用NIO模型来接受HTTP请求 

    protocol="org.apache.coyote.http11.Http11NioProtocol" 指定使用NIO模型来接受HTTP请求。默认是BlockingIO,配置为protocol="HTTP/1.1" 
    acceptorThreadCount="2" 使用NIO模型时接收线程的数目 

    2.指定使用线程池来处理HTTP请求 

    首先要配置一个线程池来处理请求(与Connector是平级的,多个Connector可以使用同一个线程池来处理请求) 
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
    maxThreads="1000" minSpareThreads="50" maxIdleTime="600000"/> 
    <Connector port="8080"
    executor="tomcatThreadPool" 指定使用的线程池 

    3.指定BlockingIO模式下的处理线程数目 

    maxThreads="150"//Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。可以根据机器的时期性能和内存大小调整,一般可以在400-500。最大可以在800左右。 
    minSpareThreads="25"---Tomcat初始化时创建的线程数。默认值4。如果当前没有空闲线程,且没有超过maxThreads,一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。 
    maxSpareThreads="75"--一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。一旦创建的线程超过此数值,Tomcat会关闭不再需要的线程。线程数可以大致上用 “同时在线人数*每秒用户操作次数*系统平均操作时间” 来计算。 
    acceptCount="100"----指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。如果当前可用线程数为0,则将请求放入处理队列中。这个值限定了请求队列的大小,超过这个数值的请求将不予处理。 
    connectionTimeout="20000" --网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。 

    4.其它常用设置 

    maxHttpHeaderSize="8192" http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。 
    URIEncoding="UTF-8" 指定Tomcat容器的URL编码格式。 
    disableUploadTimeout="true" 上传时是否使用超时机制 
    enableLookups="false"--是否反查域名,默认值为true。为了提高处理能力,应设置为false 
    compression="on"   打开压缩功能 
    compressionMinSize="10240" 启用压缩的输出内容大小,默认为2KB 
    noCompressionUserAgents="gozilla, traviata"   对于以下的浏览器,不启用压缩 
    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些资源类型需要压缩 

    5.小结 

    关于Tomcat的Nio和ThreadPool,本身的引入就提高了处理的复杂性,所以对于效率的提高有多少,需要实际验证一下。 

    6.配置示例 

    <Connector port="8080" 
    redirectPort="8443"
    maxThreads="150" 
    minSpareThreads="25" 
    maxSpareThreads="75" 
    acceptCount="100" 
    connectionTimeout="20000" 
    protocol="HTTP/1.1" 

    maxHttpHeaderSize="8192" 
    URIEncoding="UTF-8" 
    disableUploadTimeout="true" 
    enableLookups="false" 
    compression="on" 
    compressionMinSize="10240" 
    noCompressionUserAgents="gozilla, traviata" 
    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"> 
    ... 
    </Connector>

     

    展开全文
  • Tomcat调优面试题(一)

    千次阅读 2017-08-13 11:08:25
    Tomcat的优化经验 一、掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存 二、服务器资源  服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。 ...

    Tomcat的优化经验

    一、掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存
    二、服务器资源
      服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。
      (1) 对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。
      (2) 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于full GC,从而导致处理能力严重下降。
      (3) 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法还是利用下面提到的缓存。
    三、利用缓存和压缩
      对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了Nginx作为缓存服务器,将图片、css、js文件都进行了缓存,有效的减少了后端tomcat的访问。
      另外,为了能加快网络传输速度,开启gzip压缩也是必不可少的。但考虑到tomcat已经需要处理很多东西了,所以把这个压缩的工作就交给前端的Nginx来完成。
      除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我就见过一个图片从300多kb压缩到几十kb,自己几乎看不出来区别。
      四、采用集群
      单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。可以参考之前写的《利用nginx+tomcat+memcached组建web服务器负载均衡》。
    五、优化tomcat参数
      这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,主要是优化连接配置,关闭客户端dns查询。   

    1. <Connector port="8080"   
    2.            protocol="org.apache.coyote.http11.Http11NioProtocol"  
    3.            connectionTimeout="20000"  
    4.            redirectPort="8443"   
    5.            maxThreads="500"   
    6.            minSpareThreads="20"  
    7.            acceptCount="100" 
    8.            disableUploadTimeout="true" 
    9.            enableLookups="false"   
    10.            URIEncoding="UTF-8" />
    展开全文
  • 前段时间参加面试面试过程中提到服务器的调优方案,这里总结一下。 首先说一下tomcat调优方案: Tomcat本身的优化,Java虚拟机调优Tomcat 优化分为系统优化,接下来一个个介绍: 一、Tomcat本身的优化 ...

    前段时间参加面试,面试过程中提到服务器的调优方案,这里总结一下。

    首先说一下tomcat的调优方案:

    Tomcat本身的优化,Java虚拟机调优,Tomcat 优化分为系统优化,接下来一个个介绍:

     一、Tomcat本身的优化

       Tomcat 的自身参数的优化,这块很像 ApacheHttp Server。修改一下 xml 配置文件中的参数,调整最大连接数,超时等。此外,我们安装 Tomcat 是,优化就已经开始了。

    1、工作方式选择      

    为了提升性能,首先就要对代码进行动静分离,让 Tomcat 只负责 jsp 文件的解析工作。如采用 Apache 和 Tomcat 的整合方式,他们之间的连接方案有三种选择,JK、http_proxy 和 ajp_proxy。相对于 JK 的连接方式,后两种在配置上比较简单的,灵活性方面也一点都不逊色。但就稳定性而言不像JK 这样久经考验,所以建议采用 JK 的连接方式。 

    2、Connector连接器的配置

    之前文件介绍过的 Tomcat 连接器的三种方式: bio、nio 和 apr,三种方式性能差别很大,apr 的性能最优, bio 的性能最差。而 Tomcat 7 使用的 Connector  默认就启用的 Apr 协议,但需要系统安装 Apr 库,否则就会使用 bio 方式。

    3、配置文件优化

    配置文件优化其实就是对 server.xml 优化,可以提大大提高 Tomcat 的处理请求的能力,下面我们来看 Tomcat 容器内的优化。

    默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200),服务启动时,默认创建了 5 个空闲线程随时等待用户请求。

    首先,打开 ${TOMCAT_HOME}/conf/server.xml,搜索【<Executor name="tomcatThreadPool"】,开启并调整为


    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>
    注意, Tomcat 7 在开启线程池前,一定要安装好 Apr 库,并可以启用,否则会有错误报出,shutdown.sh 脚本无法关闭进程。

    然后,修改<Connector …>节点,增加 executor 属性,搜索【port="8080"】,调整为


    <Connector executor="tomcatThreadPool"
                   port="8080" protocol="HTTP/1.1"
                   URIEncoding="UTF-8"
                   connectionTimeout="30000"
                   enableLookups="false"
                   disableUploadTimeout="false"
                   connectionUploadTimeout="150000"
                   acceptCount="300"
                   keepAliveTimeout="120000"
                   maxKeepAliveRequests="1"
                   compression="on"
                   compressionMinSize="2048"
                   compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" 
                   redirectPort="8443" />
    maxThreads :Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最大的线程数,默认值是 200

    minSpareThreads:最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。

    maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。

    上边配置的参数,最大线程 500(一般服务器足以),要根据自己的实际情况合理设置,设置越大会耗费内存和 CPU,因为 CPU 疲于线程上下文切换,没有精力提供请求服务了,最小空闲线程数 20,线程最大空闲时间 60 秒,当然允许的最大线程连接数还受制于操作系统的内核参数设置,设置多大要根据自己的需求与环境。当然线程可以配置在“tomcatThreadPool”中,也可以直接配置在“Connector”中,但不可以重复配置。

    URIEncoding:指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 WEB 服务器软件配置方便,需要分别指定。

    connnectionTimeout: 网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒,可根据检测实际情况,适当修改。

    enableLookups: 是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为 false。

    disableUploadTimeout:上传时是否使用超时机制。

    connectionUploadTimeout:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。

    acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。

    keepAliveTimeout:长连接最大保持时间(毫秒),表示在下次请求过来之前,Tomcat 保持该连接多久,默认是使用 connectionTimeout 时间,-1 为不限制超时。

    maxKeepAliveRequests:表示在服务器关闭之前,该连接最大支持的请求数。超过该请求数的连接也将被关闭,1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间。

    compression:是否对响应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。

    compressionMinSize:表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048。

    compressableMimeType:压缩类型,指定对哪些类型的文件进行数据压缩。

    noCompressionUserAgents="gozilla, traviata": 对于以下的浏览器,不启用压缩。

    如果已经对代码进行了动静分离,静态页面和图片等数据就不需要 Tomcat 处理了,那么也就不需要配置在 Tomcat 中配置压缩了。

    以上是一些常用的配置参数属性,当然还有好多其它的参数设置,还可以继续深入的优化,HTTP Connector 与 AJP Connector 的参数属性值,可以参考官方文档的详细说明:

    https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

    https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html

    二、JVM 优化

    Tomcat 启动命令行中的优化参数,就是 JVM 的优化 。Tomcat 首先跑在 JVM 之上的,因为它的启动其实也只是一个 java 命令行,首先我们需要对这个 JAVA 的启动命令行进行调优。不管是 YGC 还是 Full GC,GC 过程中都会对导致程序运行中中断,正确的选择不同的 GC 策略,调整 JVM、GC 的参数,可以极大的减少由于 GC 工作,而导致的程序运行中断方面的问题,进而适当的提高 Java 程序的工作效率。但是调整 GC 是以个极为复杂的过程,由于各个程序具备不同的特点,如:web 和 GUI 程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同(主要 cup 个数,内存不同),所以使用的 GC 种类也会不同。

    1、JVM 参数配置方法

    Tomcat 的启动参数位于安装目录 ${JAVA_HOME}/bin目录下,Linux 操作系统就是 catalina.sh 文件。JAVA_OPTS,就是用来设置 JVM 相关运行参数的变量,还可以在 CATALINA_OPTS 变量中设置。关于这 2 个变量,还是多少有些区别的:

    JAVA_OPTS:用于当 Java 运行时选项“start”、“stop”或“run”命令执行。

    CATALINA_OPTS:用于当 Java 运行时选项“start”或“run”命令执行。

    为什么有两个不同的变量?它们之间都有什么区别呢?

    首先,在启动 Tomcat 时,任何指定变量的传递方式都是相同的,可以传递到执行“start”或“run”命令中,但只有设定在 JAVA_OPTS 变量里的参数被传递到“stop”命令中。对于 Tomcat 运行过程,可能没什么区别,影响的是结束程序,而不是启动程序。

    第二个区别是更微妙,其他应用程序也可以使用 JAVA_OPTS 变量,但只有在 Tomcat 中使用 CATALINA_OPTS 变量。如果你设置环境变量为只使用 Tomcat,最好你会建议使用 CATALINA_OPTS 变量,而如果你设置环境变量使用其它的 Java 应用程序,例如 JBoss,你应该把你的设置放在JAVA_OPTS 变量中。


    2、JVM 参数属性

    32 位系统下 JVM 对内存的限制:不能突破 2GB ,那么这时你的 Tomcat 要优化,就要讲究点技巧了,而在 64 位操作系统上无论是系统内存还是 JVM 都没有受到 2GB 这样的限制。

           针对于 JMX 远程监控也是在这里设置,以下为 64 位系统环境下的配置,内存加入的参数如下:

    CATALINA_OPTS="
    -server 
    -Xms6000M 
    -Xmx6000M 
    -Xss512k 
    -XX:NewSize=2250M 
    -XX:MaxNewSize=2250M 
    -XX:PermSize=128M
    -XX:MaxPermSize=256M  
    -XX:+AggressiveOpts 
    -XX:+UseBiasedLocking 
    -XX:+DisableExplicitGC 
    -XX:+UseParNewGC 
    -XX:+UseConcMarkSweepGC 
    -XX:MaxTenuringThreshold=31 
    -XX:+CMSParallelRemarkEnabled 
    -XX:+UseCMSCompactAtFullCollection 
    -XX:LargePageSizeInBytes=128m 
    -XX:+UseFastAccessorMethods 
    -XX:+UseCMSInitiatingOccupancyOnly
    -Duser.timezone=Asia/Shanghai 
    -Djava.awt.headless=true"
    为了看着方便,将每个参数单独写一行。上面参数好多啊,可能有人写到现在都没见过一个在 Tomcat 的启动命令里加了这么多参数,当然,这些参数只是我机器上的,不一定适合你,尤其是参数后的 value(值)是需要根据你自己的实际情况来设置的。

    上述这样的配置,基本上可以达到:

    系统响应时间增快;

    JVM回收速度增快同时又不影响系统的响应率;

    JVM内存最大化利用;

    线程阻塞情况最小化。

    JVM 常用参数详解:

    -server:一定要作为第一个参数,在多个 CPU 时性能佳,还有一种叫 -client 的模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试,在 32 位环境下直接运行 Java 程序默认启用该模式。Server 模式的特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境,在具有 64 位能力的 JDK 环境下默认启用该模式,可以不配置该参数。

    -Xms:表示 Java 初始化堆的大小,-Xms 与-Xmx 设成一样的值,避免 JVM 反复重新申请内存,导致性能大起大落,默认值为物理内存的 1/64,默认(MinHeapFreeRatio参数可以调整)空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制。

    -Xmx:表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的 JVM 能够使用最大值,使用 java -Xmx512M -version 命令来进行测试,然后逐渐的增大 512 的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制。

    -Xss:表示每个 Java 线程堆栈大小,JDK 5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。根据应用的线程所需内存大小进行调整,在相同物理内存下,减小这个值能生成更多的线程,但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。一般小的应用, 如果栈不是很深, 应该是128k 够用的,大的应用建议使用 256k 或 512K,一般不易设置超过 1M,要不然容易出现out ofmemory。这个选项对性能影响比较大,需要严格的测试。

    -XX:NewSize:设置新生代内存大小。

    -XX:MaxNewSize:设置最大新生代新生代内存大小

    -XX:PermSize:设置持久代内存大小

    -XX:MaxPermSize:设置最大值持久代内存大小,永久代不属于堆内存,堆内存只包含新生代和老年代。

    -XX:+AggressiveOpts:作用如其名(aggressive),启用这个参数,则每当 JDK 版本升级时,你的 JVM 都会使用最新加入的优化技术(如果有的话)。

    -XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。

    -XX:+DisableExplicitGC:在 程序代码中不允许有显示的调用“System.gc()”。每次在到操作结束时手动调用 System.gc() 一下,付出的代价就是系统响应时间严重降低,就和关于 Xms,Xmx 里的解释的原理一样,这样去调用 GC 导致系统的 JVM 大起大落。

    -XX:+UseConcMarkSweepGC:设置年老代为并发收集,即 CMS gc,这一特性只有 jdk1.5
    后续版本才具有的功能,它使用的是 gc 估算触发和 heap 占用触发。我们知道频频繁的 GC 会造面 JVM
    的大起大落从而影响到系统的效率,因此使用了 CMS GC 后可以在 GC 次数增多的情况下,每次 GC 的响应时间却很短,比如说使用了 CMS
    GC 后经过 jprofiler 的观察,GC 被触发次数非常多,而每次 GC 耗时仅为几毫秒。

    -XX:+UseParNewGC:对新生代采用多线程并行回收,这样收得快,注意最新的 JVM 版本,当使用 -XX:+UseConcMarkSweepGC 时,-XX:UseParNewGC 会自动开启。因此,如果年轻代的并行 GC 不想开启,可以通过设置 -XX:-UseParNewGC 来关掉。

    -XX:MaxTenuringThreshold:设置垃圾最大年龄。如果设置为0的话,则新生代对象不经过 Survivor 区,直接进入老年代。对于老年代比较多的应用(需要大量常驻内存的应用),可以提高效率。如果将此值设置为一 个较大值,则新生代对象会在 Survivor 区进行多次复制,这样可以增加对象在新生代的存活时间,增加在新生代即被回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。该参数只有在串行 GC 时才有效,这个值的设置是根据本地的 jprofiler 监控后得到的一个理想的值,不能一概而论原搬照抄。

    -XX:+CMSParallelRemarkEnabled:在使用 UseParNewGC 的情况下,尽量减少 mark 的时间。

    -XX:+UseCMSCompactAtFullCollection:在使用 concurrent gc 的情况下,防止 memoryfragmention,对 live object 进行整理,使 memory 碎片减少。

    -XX:LargePageSizeInBytes:指定 Java heap 的分页页面大小,内存页的大小不可设置过大, 会影响 Perm 的大小。

    -XX:+UseFastAccessorMethods:使用 get,set 方法转成本地代码,原始类型的快速优化。

    -XX:+UseCMSInitiatingOccupancyOnly:只有在 oldgeneration 在使用了初始化的比例后 concurrent collector 启动收集。

    -Duser.timezone=Asia/Shanghai:设置用户所在时区。

    -Djava.awt.headless=true:这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的 J2EE 工程中使用一些图表工具如:jfreechart,用于在 web 网页输出 GIF/JPG 等流,在 winodws 环境下,一般我们的 app server 在输出图形时不会碰到什么问题,但是在linux/unix 环境下经常会碰到一个 exception 导致你在 winodws 开发环境下图片显示的好好可是在 linux/unix 下却显示不出来,因此加上这个参数以免避这样的情况出现。

    -Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与 jmap -heap 中显示的 New gen 是不同的。整个堆大小 = 新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的 3/8。

    -XX:CMSInitiatingOccupancyFraction:当堆满之后,并行收集器便开始进行垃圾收集,例如,当没有足够的空间来容纳新分配或提升的对象。对于 CMS 收集器,长时间等待是不可取的,因为在并发垃圾收集期间应用持续在运行(并且分配对象)。因此,为了在应用程序使用完内存之前完成垃圾收集周期,CMS 收集器要比并行收集器更先启动。因为不同的应用会有不同对象分配模式,JVM 会收集实际的对象分配(和释放)的运行时数据,并且分析这些数据,来决定什么时候启动一次 CMS 垃圾收集周期。这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100 >= Xmn 就不会出现 promotion failed。例如在应用中 Xmx 是6000,Xmn 是 512,那么 Xmx-Xmn 是 5488M,也就是老年代有 5488M,CMSInitiatingOccupancyFraction=90 说明老年代到 90% 满的时候开始执行对老年代的并发垃圾回收(CMS),这时还 剩 10% 的空间是 5488*10% = 548M,所以即使 Xmn(也就是新生代共512M)里所有对象都搬到老年代里,548M 的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的 promotion failed,因此这个参数的设置必须与 Xmn 关联在一起。

    -XX:+CMSIncrementalMode:该标志将开启 CMS 收集器的增量模式。增量模式经常暂停 CMS 过程,以便对应用程序线程作出完全的让步。因此,收集器将花更长的时间完成整个收集周期。因此,只有通过测试后发现正常 CMS 周期对应用程序线程干扰太大时,才应该使用增量模式。由于现代服务器有足够的处理器来适应并发的垃圾收集,所以这种情况发生得很少,用于但 CPU情况。

    -XX:NewRatio:年轻代(包括 Eden 和两个 Survivor 区)与年老代的比值(除去持久代),-XX:NewRatio=4 表示年轻代与年老代所占比值为 1:4,年轻代占整个堆栈的 1/5,Xms=Xmx 并且设置了 Xmn 的情况下,该参数不需要进行设置。

    -XX:SurvivorRatio:Eden 区与 Survivor 区的大小比值,设置为 8,表示 2 个 Survivor 区(JVM 堆内存年轻代中默认有 2 个大小相等的 Survivor 区)与 1 个 Eden 区的比值为 2:8,即 1 个 Survivor 区占整个年轻代大小的 1/10。

    -XX:+UseSerialGC:设置串行收集器。

    -XX:+UseParallelGC:设置为并行收集器。此配置仅对年轻代有效。即年轻代使用并行收集,而年老代仍使用串行收集。

    -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集,JDK6.0 开始支持对年老代并行收集。

    -XX:ConcGCThreads:早期 JVM 版本也叫-XX:ParallelCMSThreads,定义并发 CMS 过程运行时的线程数。比如 value=4 意味着 CMS 周期的所有阶段都以 4 个线程来执行。尽管更多的线程会加快并发 CMS 过程,但其也会带来额外的同步开销。因此,对于特定的应用程序,应该通过测试来判断增加 CMS 线程数是否真的能够带来性能的提升。如果还标志未设置,JVM 会根据并行收集器中的 -XX:ParallelGCThreads 参数的值来计算出默认的并行 CMS 线程数。

    -XX:ParallelGCThreads:配置并行收集器的线程数,即:同时有多少个线程一起进行垃圾回收,此值建议配置与 CPU 数目相等。

    -XX:OldSize:设置 JVM 启动分配的老年代内存大小,类似于新生代内存的初始大小 -XX:NewSize。

    以上就是一些常用的配置参数,有些参数是可以被替代的,配置思路需要考虑的是 Java 提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾能够接受的速度和应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。假如堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。假如您把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为确保最好的性能,要把堆的大小设大,确保垃圾收集不在整个基准测试的过程中出现。

    假如系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。假如垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的周详输出,研究垃圾收集参数对性能的影响。当增加处理器时,记得增加内存,因为分配能够并行进行,而垃圾收集不是并行的。

    3、设置系统属性

    之前说过,Tomcat 的语言编码,配置起来很慢,要经过多次设置才可以了,否则中文很有可能出现乱码情况。譬如汉字“中”,以 UTF-8 编码后得到的是 3 字节的值 %E4%B8%AD,然后通过 GET 或者 POST 方式把这 3 个字节提交到 Tomcat 容器,如果你不告诉 Tomcat 我的参数是用 UTF-8编码的,那么 Tomcat 就认为你是用 ISO-8859-1 来编码的,而 ISO8859-1(兼容 URI 中的标准字符集 US-ASCII)是兼容 ASCII 的单字节编码并且使用了单字节内的所有空间,因此 Tomcat 就以为你传递的用 ISO-8859-1 字符集编码过的 3 个字符,然后它就用 ISO-8859-1 来解码。

    设置起来不难使用“ -D<名称>=<值> ”来设置系统属性:

    -Djavax.servlet.request.encoding=UTF-8

    -Djavax.servlet.response.encoding=UTF-8 

    -Dfile.encoding=UTF-8 

    -Duser.country=CN 

    -Duser.language=zh

    4、常见的 Java 内存溢出有以下三种

    (1) 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(堆)的大小。  
    (2) java.lang.OutOfMemoryError: PermGen space  —- PermGen space溢出。

    PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域。为什么会内存溢出,这是由于这块内存主要是被 JVM 存放Class 和 Meta 信息的,Class 在被 Load 的时候被放入 PermGen space 区域,它和存放 Instance 的 Heap 区域不同,sun 的 GC 不会在主程序运行期对 PermGen space 进行清理,所以如果你的 APP 会载入很多 CLASS 的话,就很可能出现 PermGen space 溢出。

    解决方法: 手动设置 MaxPermSize 大小

    (3) java.lang.StackOverflowError   —- 栈溢出

    栈溢出了,JVM 依然是采用栈式的虚拟机,这个和 C 与 Pascal 都是一样的。函数的调用过程都体现在堆栈和退栈上了。调用构造函数的 “层”太多了,以致于把栈区溢出了。通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K 的空间(这个大约相当于在一个 C 函数内声明了 256 个 int 类型的变量),那么栈区也不过是需要 1MB 的空间。通常栈的大小是 1-2MB 的。
    通常递归也不要递归的层次过多,很容易溢出。

    三、系统优化

    Windows环境下,是tomcat安装版(利用windows的系统服务启动tomcat),解决办法:

    修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun2.0\Tomcat6\Parameters\JavaOptions

           原值为:

    -Dcatalina.home=E:\Tomcat 6.0

    -Dcatalina.base=E:\Tomcat 6.0

    -Djava.endorsed.dirs=E:\Tomcat 6.0\common\endorsed

    -Djava.io.tmpdir=E:\Tomcat 6.0\temp

    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager


    -Djava.util.logging.config.file=E:\Tomcat
    6.0\conf\logging.properties

             加入:

    Xms512m -Xmx512m -XX:PermSize=128M
    -XX:MaxNewSize=256m -XX:MaxPermSize=512m

             重起tomcat服务,设置生效。

             Linux环境下, ,解决办法:

            修改“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:JAVA_OPTS=’-Xms256m-Xmx512m’

            各参数详解:

            -Xms:设置JVM初始内存大小(默认是物理内存的1/64)

            -Xmx:设置JVM可以使用的最大内存(默认是物理内存的1/4,建议:物理内存80%)

           -Xmn:设置JVM最小内存(128-256m就够了,一般不设置)

           默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。

           在较大型的应用项目中,默认的内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误“java.lang.OutOfMemoryError:
    Java heap space”,从而导致客户端显示500错误。
          -XX:PermSize :为JVM启动时Perm的内存大小

         -XX:MaxPermSize :为最大可占用的Perm内存大小(默认为32M)

         -XX:MaxNewSize,默认为16M

         PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现“java.lang.OutOfMemoryError:PermGen space”错误。

           对于WEB项目,jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小,为了避免调整),你可以使用更多的参数配置。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小,那么就会产生此错误信息了。

    其它参数:

    -XX:NewSize :默认为2M,此值设大可调大新对象区,减少Full
    GC次数

    -XX:NewRatio :改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)

    -XX:SurvivorRatio :改变Eden对象空间和残存空间的尺寸比例,意思是Eden对象空

    间的尺寸比残存空间大survivorRatio+2倍(缺省值是10)

    -XX:userParNewGC 可用来设置并行收集【多CPU】

    -XX:ParallelGCThreads 可用来增加并行度【多CPU】

    -XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】
     

    展开全文
  • 前言 性能优化是什么? 答:性能优化,简而言之,就是在不影响系统运行正确性的...今天就由阿里资深技术官来详解「性能优化」问题,从JVM、Tomcat、MySQL三种调优方式来详细讲解,以下含一些面试题、脑图以及调优文档

    前言

    性能优化是什么? 答:性能优化,简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。

    前提是什么? 答:不影响系统运行正确性

    目的是什么? 答:运行地更快时间更短,( 改善应用的“吞吐量”和“延迟”。)

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。今天就由阿里资深技术官来详解「性能优化」问题,从JVM、Tomcat、MySQL三种调优方式来详细讲解,以下含一些面试题、脑图以及调优文档等资料,需要电子版的可以直接(点击我)免费领取。

    image

    JVM 调优篇

    01 JVM相关面试题

    1. 什么是JVM?
    2. JVM由哪些部分组成?
    3. 类加载器是有了解吗?
    4. 类加载器是如何加载 class 文件的?
    5. 双亲委派模型(Parent Delegation Model)?
    6. 内存模型以及分区,需要详细到每个区放什么。
    7. 类似-Xms、-Xmn这些参数的含义
    8. 简述一下 Java 中创建一个对象的过程?
    9. 如何判断一个对象是否已经死去?
    10. 垃圾回收算法有哪些?
    11. GC什么时候开始?
    12. JVM 内存分哪几个区,每个区的作用是什么?
    13. GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

    image

    02 JVM和性能优化脑图(X-mind)

    1. Java内存区域
    2. 垃圾回收器和内存分配策略
    3. JVM的执行子系统
    4. 编写高效优雅Java程序
    5. 深入了解性能优化

    image

    03 JVM调优总结

    • JVM调优总结-序
    • JVM调优总结(一)——一些概念
    • JVM调优总结(二)——一些概念
    • JVM调优总结(三)——基本垃圾回收算法
    • JVM调优总结(四)——垃圾回收面临的问题
    • JVM调优总结(五)——分代垃圾回收详述1
    • JVM调优总结(六)——分代垃圾回收详述2
    • JVM调优总结(七)——典型配置举例1
    • JVM调优总结(八)——典型配置举例2
    • JVM调优总结(九)——新一代的垃圾回收算法
    • JVM调优总结(十)——调优方法
    • JVM调优总结(十一)——反思
    • JVM调优总结(十二)——参考资料

    image

    image

    需要电子版的可以直接(点击我)免费领取。

    Tomcat 调优篇

    01 Tomcat 面试专题

    1. Tomcat 的缺省端口是多少,怎么修改?
    2. Tomcat 有哪几种 Connector 运行模式(优化)?
    3. Tomcat 有几种部署方式?
    4. Tomcat 容器是如何创建 servlet 类实例?用到了什么原理?
    5. Tomcat 如何优化?
    6. 内存调优
    7. 垃圾回收策略调优
    8. 共享 session 处理
    9. 添加 JMS 远程监控
    10. 专业点的分析工具有
    11. 关于 Tomcat 的 session 数目
    12. 监视 Tomcat 的内存使用情况
    13. 打印类的加载情况及对象的回收情况
    14. Tomcat一个请求的完整过程
    15. Tomcat 工作模式?

    image

    02 深入剖析Tomcat(实战文档)

    • 一个简单的Web服务器
    • 一个简单的Servlet容器
    • 连接器
    • Tomcat 的默认连接器
    • servlet 容器
    • 生命周期
    • 日志记录器
    • 载入器
    • Session 管理
    • 安全性
    • StandardWrapper
    • StandardContext类
    • Host 和 Engine
    • 服务器组件和服务组件
    • Digester 库
    • 关闭钩子
    • 启动 Tomcat
    • 部署器
    • Mannager 应用程序的 servlet 类
    • 关于JMX的管理

    image

    MySQL 调优篇

    01 SQL优化面试专题

    1. 一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert一条记录,这条记录的 ID 是 18 还是 15 ?
    2. Mysql 的技术特点是什么?
    3. Heap 表是什么?
    4. Mysql 服务器默认端口是什么?
    5. 与 Oracle 相比,Mysql 有什么优势?
    6. 如何区分 FLOAT 和 DOUBLE?
    7. 区分 CHAR_LENGTH 和 LENGTH?
    8. 请简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
    9. 在 Mysql 中 ENUM 的用法是什么?
    10. 如何定义 REGEXP?
    11. CHAR 和 VARCHAR 的区别?
    12. 列的字符串类型可以是什么?
    13. 如何获取当前的 Mysql 版本?
    14. Mysql 中使用什么存储引擎?
    15. MySQL 数据表在什么情况下容易损坏?
    16. MySQL 中有哪几种锁?

    image

    02 MySQL优化问题(X-mind)

    1. 执行流程
    2. 表结构对性能的影响
    3. 索引
    4. 事务
    5. sql优化原则
    6. JOIN的原理
    7. 执行计划与执行明细

    image

    03 MySQL性能调优与架构设计(PDF)

    一、基础篇

    • 第1章 MySQL基本介绍
    • 第2章 MySQL架构组成
    • 第3章 MySQL存储引擎简介
    • 第4章 MySQL安全管理
    • 第5章 MySQL备份与恢复

    二、性能优化篇

    • 第6章 影响MySQLServer性能的相关因素
    • 第7章 MySQL数据库锁定机制
    • 第8章 MySQL数据库Query的优化
    • 第9章 MySQL数据库Schema设计的性能优化
    • 第10章 MySQLServer性能优化
    • 第11章 常用存储引擎优化

    三、架构设计篇

    • 第12章 MySQL可扩展设计的基本原则
    • 第13章 可扩展性设计之MySQLReplication
    • 第14章 可扩展性设计之数据切分
    • 第15章 可扩展性设计之Cache与Search的利用
    • 第16章 MySQLCluster
    • 第17章 高可用设计之思路及方案
    • 第18章 高可用设计之MySQL监控

    image

    以上就是关于性能优化的全部内容,由于篇幅有限,相关的详解内容并未展示,以上所有面试专题(含答案),以及各个环节的详解文档,均可以免费分享出我的电子版,有需要的朋友,直接(点击我)免费领取!

    展开全文
  • 怎样给 tomcat调优? 1.JVM参数调优 -Xms示JVM初始化堆的大小,-Xmx表示JVM堆的最大值。 这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃...
  • 怎样加大 tomcat的内存? 首先检查程序有没有限入死循环; 这个问题主要还是由java.lang.Out0fMemoryError:Java heap space引起的。 第一次出现这样的的问题以后,引发了其他的问题。在网上一查可能是JAVA的堆栈设置...
  • 今天就由京东资深技术官来详解「Java性能优化」问题,从JVM、Tomcat、MySQL三种调优方式来详细讲解,以下含一些面试题、脑图以及调优文档等资料。 核心技术JVM、Tomcat、MySQL面试题一次彻底扫盲 1. 调优篇 JVM知识...
  • tomcat面试题

    2017-12-29 11:28:57
    1.tomcat给你你怎样去调优? 1. JVM参数调优:-Xms 表示JVM初始化堆的大小,-Xmx表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致...
  • 2020JAVA面试题附答案(长期更新)

    万次阅读 多人点赞 2018-05-17 22:53:57
    2019年11月14日:更新redis缓存雪崩,击穿,穿透相关面试题,更新了tomcat调优相关问题,更新了TCP三次握手四次握手问题 JAVA基础 JAVA中的几种基本类型,各占用多少字节? 下图单位是bit,非字节 1B=8bit ...
  • Tomcat和SQL优化的面试题总结

    千次阅读 2018-11-23 23:13:37
    HOME/bin/catalina.bat中有一个set CLASSPATH,在set CLASSPATH下面可以写入要改变得参数,也可以改变java虚拟机的最大内存,永久代大小和其他参数,具体里面的其他参数我也不记得了,在tomcat调优时我一般会看文档...
  • 1、Java Web应用调优线程池 不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于...无论使用哪种应用服务器或者框架(如Tomcat、Jetty等),他们都有类似...
  • 性能优化是什么?性能优化,简而言之,就是在不影响系统运行正确性的前提下,使之...今天就由京东资深技术官来详解「Java性能优化」问题,从JVM、Tomcat、MySQL三种调优方式来详细讲解,以下含一些面试题、脑图以及...
  • Tomcat性能调优JVM性能调优一、内存调优二、垃圾回收策略调优《Netty 实现原理与源码解析 ...—— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库实体设计合集》《Java 面试题 —— 精品合集...
  • 前段时间一直有粉丝问我,有没有今年一些大厂Java面试题总结?最新抽时间整理了一些,分享给大家,大家一起共享学习! 一、性能调优系列 1.Tomcat性能调优 JVM参数调优: -Xms<size> 表示JVM初始化堆的...
  • 前段时间一直有粉丝问我,有没有今年一些大厂Java面试题总结?最新抽时间整理了一些,分享给大家,大家一起共享学习! 一、性能调优系列 1.Tomcat性能调优 JVM参数调优: -Xms<size> 表示JVM初始化堆的大小...
  • 前段时间一直有粉丝问我,有没有今年一些大厂Java面试题总结?最新抽时间整理了一些,分享给大家,大家一起共享学习!由于文章太长,有些解析没有详细列出,文末有获取文档方式。 一、性能调优系列 1.Tomcat...
  • 今天就由京东资深技术官来详解「Java性能优化」问题,从JVM、Tomcat、MySQL三种调优方式来详细讲解,以下含一些面试题、脑图以及调优文档等资料。 核心技术JVM、Tomcat、MySQL面试题一次彻底扫盲 1. 调优篇 JVM...
  • sql左连接右连接区别 left join 左连接: 将左表所有数据查询出来而右表只是查出on条件后满足的部分。左连接全称为左外连接,是外连接的一种。 right join 右连接: ...tomcat调优 找到Tomc...
  • 所以今天来写这篇文章,就是想给大家分享一份阿里P8架构师手敲20W字的调优实战笔记,另外尤其对于MySQL、Tomcat、JVM这三个特殊对待一下,看看我为其手绘相应的思维脑图以及面试相关的高频真题及答案。先来看看Ja...
  • java面试题

    2018-04-17 18:31:23
    Liunx下Tomcat调优指南1 概述由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优和自身调优两类来描述。2 调优方案1.1 外部环境调优1) 操作系统性能优化对于操作系统优化来说,是尽...
  • 面试题总结

    2018-06-11 09:20:52
    一.linux系统(1)怎么查看linux的僵尸进程(2)查看剩余内存 二.数据库(1)mysql主从同步原理?(2)如果主从同步不正常怎么办?(3)mysql怎么实现数据库备份的?...五.Tomcat(1)tomcat调优都有哪些?...
  • Java中的面试题 [3] --- Java高级知识、并发、多线程、JVM调优、分布式等 1、怎么提高并发量,请列举你所知道的方案? 2、什么是反向代理,请列举出负载均衡的几种方案? 3、列举出你说熟悉的设计模式,并对其中的一...
  • 一、理解性能优化 hibernate和Mybatis的区别 二、JVM优化 ...三、Tomcat调优 hibernate和Mybatis的区别 四、Mysql调优 hibernate和Mybatis的区别 五、Hibernate hibernate和Mybatis的区别 ...
  • 秋招面试已经过去有半个月了,我相信有人欢喜有人愁,大厂的面试题千奇百怪,不知道他会问到哪方面的知识点,我也是秋招大部队里面的一员,给大家整理出了18个大厂经常会问到200多道面试问题,涉及的知识点有,性能...
  • 一、内存调优内存方式的设置是在 catalina.sh 中,调整一下 JAVA_OPTS 变量即可,因为后面的启动参数会把 JAVA_OPTS 作为 JVM 的启动参数来处理。具体设置如下:JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k...
  • 面试题+答案领取方式见侧边栏) Tomcat 的缺省端口是多少,怎么修改? tomcat 有哪几种 Connector 运行模式(优化)? Tomcat 有几种部署方式? tomcat 容器是如何创建 servlet 类实例?用到了什么原理? ...
  • 1.写一个shell脚本,将/tmp目录下七天前的.war文件进行...5.Tomcat调优,JVM参数优化 6.MySQL数据库常见的主从方案,主从工作原理 7.在MySQL数据库中创建一个用户,只有otest数据库的管理权限,并可以让所有主机...

空空如也

空空如也

1 2 3 4 5
收藏数 90
精华内容 36
关键字:

tomcat调优面试题