zoukankan      html  css  js  c++  java
  • Tomcat 详解

    Tomcat 内存与优化
    一、Tomcat 运行环境介绍
    1.Tomcat 本身无法直接在计算机上运行,需要依赖硬件基础上的操作系统和Java虚拟机;
    2.Java 程序启动时JVM都会分配一个初始内存和最大内存给这个应用;
    3.当应用程序用到最大内存的时刻,就会触发JVM做垃圾回收(GC)动作,释放被占用的内存;
    4.因此想要调整Java程序启动时的初始内存和最大内存,需要向JVM申请;
    5.如果初始内存大小设置过小,且此时初始化的应用对象过多,虚拟机就必须重复的加载内存来满足使用;
    6.基于以上原因,最好把初始内存大小(Xms)和最大内存(Xmx)设置成一样;
    7.JVM上所有的对象都在"""堆区(heap)"""上分配内存(也有在""上分配内存的)
    8.堆区的大小是可以动态扩展的,但""""""的大小受限于系统使用的物理内存,当应用程序需要的内存超出""的最大值时,JVM虚拟机就会抛出内存溢出异常,并且导致应用程序奔溃;
    9.基于以上原因,建议“堆”的大小设置成物理内存的80%
    
    二、Tomcat 内存设置(for Linux)
    1.<CATALINA_HOME>/bin/catalina.sh #路径以及修改内存的文件
    2.JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m" #内存参数以及值
    3.-Xms:初始内存大小
    4.-Xmx:最大内存
    5.-Xss:每个线程所消耗的内存大小(如-Xss15120是指每增加一个线程就会消耗15M内存),最好设置成128K,默认值为512K
    6.-XX:PermSize:设定内存的永久保存区初始大小,默认为64M(永久是指方法区、永久代,还有年轻代、老年代)
    7.-XX:MaxPermSize:设定内存永久保存区最大大小,默认为64M
    8.其他参数:
    a)    -XX:SurvivorRatio=2: #生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,可以尝试定制生还者池设置
    b)    -XX:NewSize:    #新生成的池的初始大小,默认为2M
    c)    -XX:MaxNewSize:    #新生成的池的最大大小,默认为32M
    d)    +XX:AggressiveHeap #该参数会使得Xms没有意义,这个参数让参数JVM忽略Xmx参数,疯狂的吃掉一个G的物理内存,再疯狂的吃掉一个G的swap
    e)    -verbose:gc    #实现垃圾收集信息    
    f)    -Xloggc:gc.log    #指定来及收集日志文件
    g)    -Xmn:    #年轻代的堆区大小,一般设置成Xmx的3、4分之一
    h)    -XX:+UseParNewGC    #缩短minor收集时间(minor GC是指在年轻代触发的GC垃圾回收动作)
    I)    -XX:+UseConcMarkSweepGC #缩短major收集的时间(major收集是指在年老代触发Full GC垃圾回收动作),此选项在heap size(堆区大小)比较大而且major收集时间较长的情况下使用更合适
    j)    -XX:userParNewGC #可用来并行收集(多CPU)
    k)    -XX:ParallerGCThreads #可用来增加并行度(多CPU)
    l)    -XX:UseParallerGC #设置后可以使用并行清理收集器(多CPU)
    m)    如果JVM的堆大小大于 1G,则应该使用以下配置:
    -XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16
    或者将堆的总大小的50%到60%分配给新生成的池,调大新对象区,减少Full GC次数。
    9.注意:
    a)    虚拟机的"堆区大小"决定了虚拟机花费在收集垃圾上的时间和频率;
    b)    如果"堆的大小"很大,那么执行Full GC垃圾回收就会很慢,但是频率降低了;
    c)    如果把"堆的大小"调小,执行Full GC垃圾收回就会很快,但是会更加频繁;
    d)    因此建议把"堆区大小"设置物理内存的80%左右
    e)    建议把内存的最高值和最低值的差值缩小。不然会浪费很多内存;
    f)    最低值加大,那么最高值可以随便设置;
    g)    但是要根据实际的物理内存来设置,且大于物理内存,tomcat就无法启动,可能会导致内存被系统收回,终止进程
    
    三、Tomcat 内存溢出以及调整
    1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
      a)    释义:
        1.JVM在启动的时刻会自动设置JVM heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可能超过物理内存;
        2.可以利用JVM提供的 -Xmn -Xms -Xmx等选项进行设置;
        3.heap的大小是年轻代(Young Generation)和年老代(Tenured Generaion)之和;
        4.在JVM中如果98%的时间用于GC,且可用的heap size不足2%的时刻将抛出此异常信息;
    
      b)    解决:
        1.手动设置MaxPermSize的大小
        2.JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" 
    
    2. java.lang.OutOfMemoryError: PermGen space ---- PermGen space溢出
      a)    释义:
        1.PermGen Space全程是Permanent Generation space,是指内存的永久保存区域;
        2.这里内存溢出的原因是因为这块内存主要是被JVM存放class和meta信息的,class在被load的时刻被放入PermGen Space区域;
        3.PermGen Space区域与存放instance的heap区域不同,GC不会在主程序运行期间对PermGen Space进行清理;
        4.基于以上原因,如果你的APP会载入很多class的话,就很可能出现PermGen Space溢出;
    
      b)    解决:
        1.手动设置MaxPermSize大小
    
    3.java.lang.StackOverflowError ---- 栈溢出
      a)    释义:
        1.JVM采用的是栈式虚拟机,函数的调用过程都体现在堆栈和退栈上;
        2.调用构造函数的""太多了,以至于把栈区溢出了;
    
    b)    解决:
      1.修改程序
    
    4.ava.lang.OutOfMemoryError: GC overhead limit exceeded 
    
      a)    这里的意思是指JVM溢出
    
      b)    增加参数,-XX:-UseGCOverheadLimit,关闭这个特性,同时增加heap大小,-Xmx1024m

    参考自:

  • 相关阅读:
    docker部署Nginx
    docker的常用命令
    centos上安装docker
    springcloud负载均衡及Ribbon
    maven下载私服jar
    spring security异常处理的三种方式
    spring security权限控制
    北京理工大学复试上机--2001A
    北京理工大学复试上机--2000
    PAT1067 试密码 (20分)——测试点4分析 一个易错点
  • 原文地址:https://www.cnblogs.com/g-sheng/p/7550981.html
Copyright © 2011-2022 走看看