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

Tomcat 内存与优化篇的更多相关文章

  1. tomcat 内存参数优化示例

    https://www.cnblogs.com/cornerxin/p/9304100.html

  2. Tomcat配置与优化(内存、并发、管理)与性能监控

    原文链接:http://blog.csdn.net/xyang81/article/details/51530979 一.JVM内存配置优化 在开发当中,当一个项目比较大时,依赖的jar包通常比较多, ...

  3. 【Tomcat】Tomcat配置与优化(内存、并发、管理)【自己配置】

    一.JVM内存配置优化 主要通过以下的几个jvm参数来设置堆内存的: -Xmx512m 最大总堆内存,一般设置为物理内存的1/4 -Xms512m 初始总堆内存,一般将它设置的和最大堆内存一样大,这样 ...

  4. Kafka集群优化篇-调整broker的堆内存(heap)案例实操

    Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ...

  5. Tomcat内存优化

    一.Tomcat内存优化 T omcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OPTS参数. 1.JAVA_OP ...

  6. 【Tomcat】如何优化tomcat配置(从内存、并发、缓存4个方面)优化

    一.Tomcat内存优化 ** Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数. JAVA_O ...

  7. [Android 性能优化系列]内存之基础篇--Android怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  8. [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  9. tomcat内存、连接数优化

    1.检測系统能够设置的内存大小 java -Xmx1024M -version(当中1024表示检測内存能否够调整到这个数) 2.设置tomcat内存 在tomcat_home/bin/catalin ...

随机推荐

  1. Oracle用户解锁的三种办法及默认的用户与密码

    ORA-28000: the account is locked-的解决办法 2009-11-11 18:51 ORA-28000: the account is locked 第1步:使用PL/SQ ...

  2. iptables 实现centos内网机器访问外网

    环境:一台带外网和内网的机器,另一台只有内网,默认不能上网.两台机器都是centos系统带外网机器的外网ip为 123.221.20.11, 内网ip为 192.168.15.100内网机器的内网ip ...

  3. Javascript进阶篇——(DOM—节点---插入、删除和替换元素、创建元素、创建文本节点)—笔记整理

    插入节点appendChild()在指定节点的最后一个子节点列表之后添加一个新的子节点.语法: appendChild(newnode) //参数: //newnode:指定追加的节点. 为ul添加一 ...

  4. Sass函数--颜色函数--HSL函数

    HSL函数简介HSL颜色函数包括哪些具体的函数,所起的作用是什么: hsl($hue,$saturation,$lightness):通过色相(hue).饱和度(saturation)和亮度(ligh ...

  5. silverlight visifire控件图表制作——silverlight 后台方法打印

    一.后台方法 1.添加引用:using System.Windows.Printing; 2.全局变量://定义图片和文本打印变量  PrintDocument printImage; 3.构造方法体 ...

  6. Android电子书翻页效果实现

    这篇文章是在参考了别人的博客基础上,修改了其中一个翻页bug,并且加了详细注释 先看效果 其中使用了贝赛尔曲线原理,关于贝赛尔曲线的知识,推荐大家看下http://blog.csdn.net/hmg2 ...

  7. Java系列--第一篇 Maven+Spring+Spring MVC+mybatis 示例

    基于Maven的Spring+SpringMVC+Mybatis的一个小项目的搭建,由于使用Maven3.1.0管理,所以Spring等都将使用的是时下(2013/9/8)最新的版本.即从http:/ ...

  8. 锋利jQuery 学习整理之 第六章 jQuery 与Ajax 的应用

    1.Ajax 的XMLHttpRequest 对象 XMLHttpRequest 是Ajax 的核心,它是Ajax 实现的关键---发送异步请求.接受响应及执行回调都是通过它来完成的.XMLHttpR ...

  9. PC机安装android apk | adb install -r

    PC 下载 *****.apk 通过adb直接安装到android系统

  10. GSoap的使用(调用webservice接口)

    由于本人写项目时使用到C++要调用C#写得后台服务器发布的webservice,因此抽出来了一点时间整理相关的知识如下 gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它可以简单快速地 ...