Tomcat内存溢出的原因

在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。

这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况:

1.OutOfMemoryError: Java heap space

2.OutOfMemoryError: PermGen space

3.OutOfMemoryError: unable to create new native thread.

Tomcat内存溢出解决方案

对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。(-Xms -Xmx -XX:PermSize -XX:MaxPermSize)

最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。

第一种:是堆溢出。

在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

没有内存泄露的情况下,调整-Xms -Xmx参数可以解决。

-Xms:初始堆大小

-Xmx:最大堆大小

但堆的大小受下面三方面影响:

1.相关操作系统的数据模型(32-bt还是64-bit)限制;(32位系统下,一般限制在1.5G~2G;我在2003 server 系统下(物理内存:4G和6G,jdk:1.6)测试 1612M,64为操作系统对内存无限制。)

2.系统的可用虚拟内存限制;

3.系统的可用物理内存限制。

堆的大小可以使用 java -Xmx***M version 命令来测试。支持的话会出现jdk的版本号,不支持会报错。

-Xms -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m

以上情况还不能解决问题,查看IDEA的工具按钮,打开“settings”按钮—“compiler”,打开一个设置对话框,在最后一行修改为:Maximum heap size (Mb):1024 即可。

第二种:永久保存区域溢出

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。但目前的hibernate和spring项目中也很容易出现这样的问题。http://www.javaeye.com/topic/80620?page=1 的帖子有讨论的这个问题。可能是由于这些框架会动态class,而且jvm的gc是不会清理PemGen space的,导致内存溢出。

这一个一般是加大-XX:PermSize -XX:MaxPermSize 来解决问题。

-XX:PermSize 永久保存区域初始大小

-XX:PermSize 永久保存区域初始最大值

这一般结合第一条使用,比如 set JAVA_OPTS= -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:PermSize=256M

有一点需要注意:java -Xmx***M version 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize的和 比如系统支持最大的jvm堆大小事1.5G,那 -Xmx1024m -XX:PermSize=768M 是无法运行的。

例如:

严重: An exception or error occurred in the container during the request process
ing
java.lang.OutOfMemoryError: PermGen space
2009-5-6 8:55:57 org.apache.catalina.connector.CoyoteAdapter service
严重: An exception or error occurred in the container during the request process
ing
java.lang.OutOfMemoryError: PermGen space
2009-5-6 8:56:02 org.apache.catalina.connector.CoyoteAdapter service
严重: An exception or error occurred in the container during the request process
ing
java.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" jav
a.lang.OutOfMemoryError: PermGen space

解决方法:
E:\apache-tomcat-5.5.20\bin\catalina.bat 在这个文件里设置成

set JAVA_OPTS=-server -Xms1024m -Xmx1024m -XX:PermSize=256m

oracle环境变量:

d:\oracle\product\10.2.0\client_1\bin;

第三种:无法创建新的线程。

这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。

这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。

产生这种现象的原因如下(从这个blog中了解到原因:http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html):

每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。

这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。

给出一个有关能够创建线程的最大个数的估算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

对于jdk1.5而言,假设操作系统保留120M内存:

1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads

1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads

在2000/XP/2003的boot.ini里头有一个启动选项,好像是:/PAE /3G ,可以让用户进程最大内存扩充至3G,这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。

因此这种情况需要结合操作系统进行相关调整。

因此:我们需要结合不同情况对tomcat内存分配进行不同的诊断才能从根本上解决问题。

tomcat内存溢出的解决方法相关推荐

  1. MyEclipse 2015 运行tomcat 内存溢出的解决方法

    MyEclipse 2015 运行tomcat 内存溢出的解决方法 参考文章: (1)MyEclipse 2015 运行tomcat 内存溢出的解决方法 (2)https://www.cnblogs. ...

  2. Java常见的几种内存溢出及解决方法

    Java常见的几种内存溢出及解决方法[情况一]: java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另 ...

  3. python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法

    Python内存泄漏和内存溢出的解决方法 发布时间:2020-10-30 23:08:34 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关Python内存泄漏和内存溢出的解决方 ...

  4. ionic3生产打包javascript内存溢出的解决方法

    ionic3生产打包javascript内存溢出的解决方法 参考文章: (1)ionic3生产打包javascript内存溢出的解决方法 (2)https://www.cnblogs.com/wei- ...

  5. 内存泄露、内存溢出以及解决方法

    目录(?)[+] 内存泄露是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序内存无线增长.更广义的内存泄露包括未对系统的资源的及时释放,比如句柄等. 内存溢出即用户在 ...

  6. 基于Java内存溢出的解决方法详解

    一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆 ...

  7. 【移动开发】EditText输入字数限制总结(包括中文输入内存溢出的解决方法)...

    限定EditText输入个数的解决方案很多,但是一般主要考虑两点,也就是处理两件事: (1)不同语言字符(英文.中文等)处理方式 (2)输入字符达到数目后,是否仍然允许用户输入 第一点,涉及的东东其实 ...

  8. php查询mysql返回大量数据结果集导致内存溢出的解决方法

    web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答 ...

  9. 【转】android内存溢出的解决方法

    <a href="http://21cnbao.blog.51cto.com/109393/1024924">http://21cnbao.blog.51cto.com ...

  10. Tomcat启动报内存溢出错误解决(两种)

    1.绿色版Tomcat,启动报内存溢出错误:java.lang.OutOfMemoryError: PermGen space异常 找到D:\Tomcat-7\apache-tomcat-7.0.28 ...

最新文章

  1. 在线作图|2分钟在线绘制三维CCA图
  2. AI模糊测试:下一个重大网络安全威胁
  3. mysql服务器消失_MySQL服务器已经消失了
  4. 求职特训营火热来袭,阿里大咖教你制作专业简历
  5. python获取cookies
  6. c++11 继承构造
  7. 治疗拖延症晚期患者的三张处方
  8. 网络:常见的端口号及分类
  9. 用C语言编写链式存储的线性表(含代码实现)
  10. oracle数据库索引介绍,SQL Server和Oracle数据库索引介绍
  11. 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 (转)
  12. Atitit nlp 自然语言处理attilax总结 目录 1.1. 主要范畴 1 1.2. 研究难点 2 2. Ati涉及的领域(文档 tts 分词 抽取 摘要 检索) 2 3. Atit
  13. paip.asp vbs通过CLI命令行调用PHP代码
  14. 域控下发脚本_让系统及时的通过域用户脚本自动的打补丁
  15. 英特尔固态硬盘测试软件,SSD固态硬盘检测测试软件(Intel SSD Toolbox)
  16. 关于戴尔等AC9560 160MHZ 网卡驱动出现感叹号,无法正常使用wifi解决办法之一
  17. 两台计算机怎么链接局域网,两台电脑怎么连接局域网
  18. [音乐欣赏]夜空中最亮的星,张杰,苏阳,新闻晚高峰结束曲
  19. STL库:string
  20. 系统集成项目管理工程师05《项目进度管理》

热门文章

  1. sql2008转到sqk2000的步骤
  2. 批量修改已下载的图片格式
  3. vue中安装axios
  4. itext7相关使用
  5. 毕设专用 基于Vue的大病保险管理系统 这个开源项目你值得拥有
  6. 机器人学DH参数及利用matlab符号运算推导
  7. Swift:分别使用SwiftyJSON、ObjectMapper、HandyJSON处理JSON
  8. vs2013编译ffmpeg之三十五 xavs、xvidcore
  9. linux ubuntu美化,[linux] 我的ubuntu美化之路
  10. 基于探索者串口更新字库笔记