`

tomcat out of Memory error

    博客分类:
  • J2EE
阅读更多

net address: http://www.iteye.com/problems/58637

 

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

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

    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.iteye.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 是无法运行的。

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

    这种现象比较少见,也比较奇怪,主要是和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 out of memory solution

    标题与描述中的关键词“Tomcat Out of Memory Solution”指向了在运行Tomcat服务器时遇到内存溢出错误(Out of Memory Error)的解决方法。在IT领域,尤其是Java应用服务器环境中,Tomcat作为一款广泛使用的开源轻量...

    linux环境下tomcat的启动、关闭及常见问题

    4. **内存不足**:如果出现`Out of Memory`错误,可能需要调整JVM的内存设置。在`bin/catalina.sh`文件中,找到`CATALINA_OPTS`行,添加或修改内存参数,如`-Xms1024m -Xmx2048m`。 5. **日志分析**:通过查看`...

    tomcat溢出解决建议方案

    如果应用加载大量类或者使用SSH2等框架导致动态类生成,可能会超出默认大小,引发`Out of MemoryError: PermGen space`。 解决 PermGen Space溢出的方法: 1. **减少重复jar文件**:将相同的第三方jar移动到Tomcat...

    tomcat manage控制台参数解析、附图

    - **Error Count**: 出现错误的请求数。 - **Bytes Sent**: 发送给客户端的总字节数。 - **Bytes Received**: 从客户端接收的总字节数。 - **Sessions**: 当前活动的会话数量。 - **Session Creation Rate**: 新创建...

    tomcat-5.5.23

    ============================================ <br>Out of the box, Tomcat 5.5 requires the Java 2 Standard Edition Runtime Environment (JRE) version 5.0 or later. However, you can also run Tomcat...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    内存溢出(Out Of Memory Error,简称OOM)通常发生在程序尝试分配内存但系统无法提供足够空间时。在Java中,这主要与JVM(Java虚拟机)的内存模型有关,该模型包括堆(Heap)、栈(Stack)、方法区(Method Area)...

    数据库更新工具+tomcat内存溢出解决办法+birt

    内存溢出问题(Out of Memory Error,OOME)在高负载或长时间运行的环境中常见,通常是由于内存分配不当或者垃圾回收机制失效导致的。解决Tomcat内存溢出的常见策略包括: 1. 调整JVM参数:增加堆大小(-Xms和-Xmx...

    tomcat8 + nginx + memcached + cas 实现负载均衡的配置包

    Configuration for the default TicketRegistry which stores the tickets in-memory and cleans them out as specified intervals. <!-- memcached 配置开始 --> <!-- Ticket Registry --> ...

    Myeclipse下java.lang.OutOfMemoryError Java heap space的解决

    - 可以借助如VisualVM、Eclipse Memory Analyzer (MAT)等工具来监控和分析程序的内存使用情况。 - 通过这些工具可以帮助开发者更准确地定位到内存泄漏的位置,并给出优化建议。 5. **清理无用项目**: - 定期...

    完美解决java.lang.OutOfMemoryError处理错误的问题

    5. **内存分析工具**:使用如MAT(Memory Analyzer Tool)、VisualVM等工具进行内存分析,查找内存泄漏或异常对象增长。 6. **优化策略**:实施内存优化策略,如对象池、数据分页加载、及时关闭数据库连接等。 案例...

    java.lang.OutOfMemoryError处理错误

    在Tomcat中java.lang.OutOfMemoryError: Java heap space异常处理: 1. Heap size JVM堆的设置是指Java程序运行过程中JVM可以调配使用的内存空间的设置。 2. JVM在启动的时候会自动设置Heap size的值,其初始空间...

    java heap space解决方法

    在Java应用程序运行过程中,经常会遇到“Out of Memory Error: Java Heap Space”的错误提示。这种错误通常发生在Java虚拟机(JVM)的堆内存不足时,导致程序无法继续运行。为了解决这一问题,本文将详细介绍如何...

    Intellij Idea 涵盖安装、配置、常见问题

    1. **内存溢出**:如果遇到“Out of Memory”错误,可以在IDE的`Help > Edit Custom VM Options`中增加堆内存分配。 2. **启动慢**:可以优化启动速度,如关闭不必要的启动服务、禁用不必要的插件。 3. **代码提示...

    PermGen space

    #### 为何会出现PermGen Space的Out of Memory Error? 当应用程序加载了大量的类或者动态生成了很多类(例如通过字节码生成工具或预编译操作),PermGen Space可能会迅速耗尽。特别是在Web应用环境下,如部署Web...

    commons-fileupload-1.2.jar和commons-io-1.3.2.jar

    // maximum size that will be stored in memory //允许设置内存中存储数据的门限,单位:字节 factory.setSizeThreshold(4096); // the location for saving data that is larger than getSizeThreshold() //...

    died

    在Java编程中,这种情况通常是由于错误、异常未捕获,内存溢出(Out Of Memory),线程死锁,或者是系统资源耗尽等原因导致的。 【描述】"died"的描述过于简洁,但我们可以从中推测出一个程序或服务在执行时遇到了...

    整理的2018 java面试汇总,要面试的抓紧看了

    - OOM(Out Of Memory):内存溢出。 - SOE(StackOverflowError):栈溢出。 - **GC(Garbage Collection)算法** - 包括标记-清除、复制、标记-压缩等算法。 - **JVM监控工具** - 如jps、jstat、jmap、jinfo...

Global site tag (gtag.js) - Google Analytics