文档章节

Tomcat内存溢出的原因

Day
 Day
发布于 2013/03/17 18:44
字数 1321
阅读 419
收藏 25
 

    在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况:

    1.OutOfMemoryError: Java heap space

    2.OutOfMemoryError: PermGen space

    3.OutOfMemoryError:unable to create new native thread.

   对于前两种情况,在应用本身没有内存泄露的情况下可以用设置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 系统下(物理内存:4G6Gjdk1.6)测试 1612M64为操作系统对内存无限制。)

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

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

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

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

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

    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这一部分用于存放ClassMeta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放InstanceHeap区域不同,GCGarbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APPLOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。但目前的hibernatespring项目中也很容易出现这样的问题。可能是由于这些框架会动态class,而且jvmgc是不会清理PemGen space的,导致内存溢出。

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

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

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

    这一般结合第一条使用,比如 set JAVA_OPTS= -Xms 1024m -Xmx 1024m -XX:PermSize=128M -XX:PermSize=256M

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

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

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

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

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

    每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5GJVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM1500M的内存堆里创建。在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/2003boot.ini里头有一个启动选项,好像是:/PAE /3G ,可以让用户进程最大内存扩充至3G,这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。 因此这种情况需要结合操作系统进行相关调整。

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

本文转载自:

Day

Day

粉丝 34
博文 14
码字总数 10261
作品 0
杭州
程序员
私信 提问
加载中

评论(2)

Day
Day 博主

引用来自“逍遥道人”的评论

这几天发现项目当中也报了第2种错,但是换上后调整大小后,还有这个问题

是不是程序本身有问题,可以看一个文章,http://tivan.iteye.com/blog/1487855,可以定位一下具体哪个问题导致溢出
calvin_6
calvin_6
这几天发现项目当中也报了第2种错,但是换上后调整大小后,还有这个问题
启动SSH框架项目 Tomcat报错

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bitree1/article/details/50184055 org.apache.catalina.core.StandardContext listenerStart严重: Exception......

bitree1
2015/12/05
0
0
【Java】内存问题——内存溢出

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tr1912/article/details/82261379 模拟内存溢出 我们通过自己写代码,模拟一下两种内存溢出的情况,一种是堆内...

王啸tr1912
2018/08/31
0
0
tomcat启动报错Exception in main等错误

原因:未配置tomcat关于项目的内存,在启动的时候会内存溢出,然后报错,修改tomcat内存即可 (1)找到eclipse中的server栏目,然后双击tomcat,打开tomcat的配置文件 (2)点击General Inf...

TroubleA
2018/04/26
35
0
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

本来想写一写项目中遇到的内存溢出的问题,看了好多博客,发现有一篇特别好的博客,拾人牙慧,共享分享。 转载:http://outofmemory.cn/c/java-outOfMemoryError java.lang.OutOfMemoryErro...

mengdonghui123456
2017/02/07
0
0
JVM第一篇:一个Java内存泄漏的排查案例

最近在看《深入理解Java虚拟机:JVM高级特性与最佳实践》(第二版)这本书,理论+实践结合,深入浅出,强烈推荐给大家。 这两天在“小怪的java群”里面也对JVM内容进行了一个讨论,讨论的内容...

小怪聊职场
2018/05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
7分钟前
1
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
3
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
12
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
13
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部