一、Tomcat和JDK的关系:

1. Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java 虚拟机。

2. JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明, 一般的JAVA程序在运行都可以通过-Xms -Xmx来调整应用程序的初始内存和最大内存:  这两个值的大小一般根据需要进行设置。

3.为什么一般把-Xms和-Xmx设置成一样大?

初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负 载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应 、用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。

Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,会造成内存溢出的异常。

二、常见的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的。通常递归即使递归的层次不会过多,也很容易溢出。

解决方法:修改程序。

三、怎样修改Tomcat的初始化内存

有如下修改方法:

1、Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:

set JAVA_OPTS=-server -Xms2048m -Xmx2048m -Xss512k -XX:PermSize=512M -XX:MaxNewSize=512m -XX:MaxPermSize=780m

参数说明:

-server:一定要作为第一个参数,在多个CPU时性能佳

  JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'

  需要把这个两个参数值调大。例如:

  JAVA_OPTS='-Xms256m -Xmx512m'

  表示初始化内存为256MB,可以使用的最大内存为512MB。

住,必须要有m(表示兆,如果没有,则是KB)

2.  环境变量中设变量名:JAVA_OPTS     变量值:-Xms512m   -Xmx512m

3.   前两种方法针对的是bin目录下有catalina.bat的情况(比如 直接解压的Tomcat等),但是有些安装版的Tomcat下没有catalina.bat,这个时候可以采用如下方法,当然这个方法也是最通用的方法: 打开tomcatHome//bin//tomcat7w.exe,点击Java选项卡,然后将会发现其中有这么两项:Initial memory pool和Maximum memory pool。

其中Initial memory pool这个就是初始化设置的内存的大小。Maximum memory pool这个是最大内存的大小。 设置完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了。

4. Eclipse中修改JVM内存

Eclipse->Window->Preferences->Server->Runtime Environments->选中Apache Tomcat v5.0->点击Edit按钮->在弹出对话框里点击JRE后面的Installed JREs按钮->在弹出对话框中选中tomcat使用的那个JRE->点击Edit按钮->在弹出对话框中,

找到Default VM Arguments,并在输入框中输入:-Xms110M -Xmx110M

然后我们在jvisualvm控制台可以看到:

其实除了进行常见的-Xms和-Xmx的设置外,还能对jvm参数进行如下的设置,下面接着说明jvm参数的常用配置。

四、jvm参数说明:

-server:一定要作为第一个参数,在多个CPU时性能佳 
-Xms:java Heap初始大小。 默认是物理内存的1/64。
-Xmx:java heap最大值。不可超过物理内存。

-XX:PermSize:设定内存的永久保存区初始大小,用visualvm.exe可见其缺省值为64M。

-XX:MaxPermSize:设定内存的永久保存区最大 大小,用visualvm.exe可见其缺省值为64M。

-XX:SurvivorRatio=2:生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,您可以尝试设置该值。

-XX:NewSize:新生成的池的初始大小。 缺省值为2M。

-XX:MaxNewSize: 新生成的池的最大大小。   缺省值为32M。

如果 JVM 的堆大小大于 1GB,则应该使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者将堆的总大小的 50% 到 60% 分配给新生成的池。调大新对象区,减少Full GC次数。

+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。 
-Xss:每个线程的Stack大小。
-verbose:gc 现实垃圾收集信息 
-Xloggc:gc.log 指定垃圾收集日志文件 
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一 
-XX:+UseParNewGC :缩短minor收集的时间 
-XX:+UseConcMarkSweepGC :缩短major收集的时间 此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。

-XX:userParNewGC 可用来设置并行收集【多CPU】
-XX:ParallelGCThreads 可用来增加并行度【多CPU】
-XX:UseParallelGC 设置后可以使用并行清除收集器【多CPU】

五、关于垃圾收集的一些经验:

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

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

一个要注意的地方:建议把内存的最高值跟最低值的差值缩小,不然会浪费很多内存的, 最低值加大 ,最高值可以随便设,但是要根据实际的物理内存 ,如果内存设置太大了,比如设置了512M最大内存,但如果没有512M可用内存,Tomcat就不能启动,还有可能存在内存被系统回收,终止进程的情况。

六、 Tomcat 7中怎样查看内存的使用情况

1. 在$Tomcat_Home/conf/tomcat-users.xml下配置一个tomcat user,并使用http://localhost:8080/manager 访问。

<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager-gui"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="swang6" password="swang6" roles="manager-gui"/>
</tomcat-users>

2. 点击右方的Server Status.

转自: http://josh-persistence.iteye.com/blog/1973578

从JVM的常见异常来看Tomcat中内存的设置相关推荐

  1. java内存设置最大内存_JVM中内存的设置和分配(最大内存,总内存,剩余内存的区别)...

    1.设置分配的内存大小 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -vmargs 说明后面是VM的参数,所以后面的 ...

  2. 【JVM】常见调试排错场景、内存与线程Dump分析

    目录 OOM分析 Java堆内存溢出 元空间/方法区溢出 线程Dump OOM分析 Java堆内存溢出 启动参数: -Xms250m -Xmx250m ,最大最小堆内存250m,禁止自动扩展内存 -X ...

  3. Tomcat中JVM内存溢出及合理配置(转:http://blog.csdn.net/ye1992/article/details/9344807)

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识 ...

  4. tomcat中 JVM 内存溢出及合理配置

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识 ...

  5. Servlet学习DAY_01:服务器概念/Web服务器的作用/ Servlet概念/ 如何关联和解除Tomcat/ 创建一个Web工程 /Servlet响应流程/ Get-Post /常见异常

    Servlet 什么是服务器 服务器就是一台高性能电脑 电脑上安装了提供服务的软件就称为 xxx服务器 举例: 邮件服务器: 就是在电脑上安装了提供邮件收发服务的软件 ftp服务器: 就是在电脑上安装 ...

  6. Tomcat中部署后JspFactory报异常的解决方案

    http://developer.51cto.com/art/201205/338496.htm The method getJspApplicationContext(ServletContext) ...

  7. 数组中的两个常见异常

    数组中的两个常见异常 一.数组索引越界异常: ​ 数组索引越界异常: ArrayIndexOutOfBoubdsException ​ 当访问了不存在的索引时 原因: ​ 操作数组的时候使用的索引值不 ...

  8. JAVA中常见异常小结

    JAVA中常见异常小结 参考文章: (1)JAVA中常见异常小结 (2)https://www.cnblogs.com/lq147760524/p/6926175.html (3)https://ww ...

  9. Java学习笔记--Java中必记常见异常

    JAVA常见异常 Java.io.NullPointerException null 空的,不存在的 NullPointer 空指针 空指针异常,该异常出现在我们操作某个对象的属性或方法时,如果该对象 ...

最新文章

  1. python读取数据库导出文件_Python 获取 datax 执行结果保存到数据库的方法
  2. gradle的下载与环境变量配置
  3. python去重语句_Python Dataframe 指定多列去重、求差集的方法
  4. 重复文件查找_Duplicate File Remover PRO for mac(Mac文件重复查找软件)
  5. 无论用手工处理还是用计算机进行处理,会计电算化试卷
  6. 如何提高服务器网站访问速度,如何有效提升网站打开速度?
  7. python结巴库下载_python结巴怎么安装
  8. 柏力纪德:网店开店之后怎么运营
  9. 区块链技术解决投行电子底稿监管痛点 中国证券业协会在“中证链”发布首个应用
  10. 自己搭建一个前后端的项目-适合新手学习
  11. SSM框架搭建(maven)
  12. 很是惆怅,不知如何看待自己智能车竞赛获奖结果
  13. n3160装微软服务器,英特尔赛扬N3160处理器性能跑分评测
  14. CuteFTP、FlashFXP、FileZilla 基本应用比较
  15. 决策树--信息增益、信息增益比、Geni指数的理解
  16. Web:选择器的种类
  17. 幼儿园视频监控基于H5直播技术应用优势
  18. android学音标软件,英语音标学习助手
  19. 在Java Web项目中建src/main/java包
  20. Java中的向上取整 Math.ceil(double)

热门文章

  1. hive 和 impala 时间参数错误的问题 yyyy-MM-dd
  2. R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
  3. 用于区分IE的:条件注释
  4. linux -- chcp
  5. 服务器硬盘SAS与SATA区别介绍
  6. Python爬虫(三)_urllib2:get和post请求
  7. legend3---Homestead中Laravel项目502 Bad Gateway
  8. MapReduce输入输出的处理流程及combiner
  9. xp sp3安装.Net 4.0提示严重错误,0x80070643,解决办法2017版
  10. CloudStack学习-2