`
xiaocao000
  • 浏览: 227152 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java OOM

阅读更多
原文地址:http://www.blogjava.net/allen-zhe/archive/2007/12/18/168556.html


Tomcat给我的java.lang.OutOfMemoryError: PermGen

今天,Tomcat给了我这么一个异常:java.lang.OutOfMemoryError: PermGen space。自己是第一次遇到,抱着好奇的心情google了一下,居然是个很常见的异常!故记录一下。:)


原因:
      PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

解决方法:

1. 手动设置MaxPermSize大小
      修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m

catalina.sh下为:
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"


2. 将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。


如果遇到这个异常:java.lang.OutOfMemoryError: Java heap space 是什么原因呢?

解释:
Heap size 设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

解决方法:
      手动设置Heap size
      修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m   -XX:MaxNewSize=256m

或修改catalina.sh
在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS  -server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"




另外看到了另外一个帖子,觉得挺好,摘抄如下:

主题: 分析java.lang.OutOfMemoryError: PermGen space

SUN JDK+Tomcat 5.5.20运行服务的时候遇到问题,服务器跑几天后就会挂掉,并报java.lang.OutOfMemoryError: PermGen space异常。


发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 。然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。

但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生。

于是有人对更基础的JVM做了检查,发现了问题的关键。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!

2003年的时候就有一个bug报告给sun,但是到现在,这个bug还没有close!有人在这个bug加了句评语:“A bug this critical is open since 2003? Absolutely shameful.” 我觉得SUN在这个BUG上确实有些丢脸。

对这个bug最彻底的解决办法就是不要用SUN的JDK,而改用BEA的 JRokit.

打不过,还逃不过吗? 有众多的选择,这就是开源的好。 :)


最后,给出几篇文章供大家学习参考:
Java虚拟机的选项:http://www.tot.name/show/3/7/20061112220131.htm
Hot Spot JVM5中的GC调优:http://www.tot.name/show/3/7/20061112220201.htm
分享到:
评论

相关推荐

    java OOM内存泄漏原因及解决方法

    Java OOM内存泄漏原因及解决方法 _java OOM内存泄漏原因_ Java OOM(Out Of Memory)是指Java虚拟机(JVM)因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时抛出的错误。出现OOM的原因...

    Java内存各部分OOM出现原因及解决方法(必看)

    Java内存管理是Java程序员必须掌握的关键知识,尤其是对于防止和处理OutOfMemoryError(OOM)异常来说。本文将深入探讨Java内存的各个区域,以及它们可能导致的OOM问题及其解决方案。 首先,Java内存主要分为以下几...

    一个线程oom会影响其他线程吗1

    Java 多线程和 OOM 异常处理 在 Java 中,多线程编程时,常见的问题是一个线程抛出 Out Of Memory(OOM)异常是否会影响其他线程的运行。本文将通过实践和分析来解答这个问题,同时探讨主线程和子线程之间的关系。 ...

    java-error-in-idea64主要是javaJVM的dump导出学习使用

    Java错误在IDEA64中通常涉及到Java虚拟机(JVM)的问题,特别是当出现“Out Of Memory”(OOM)异常时。这个错误表明程序在运行过程中耗尽了可用内存,导致JVM无法正常工作。在这种情况下,程序员会生成一个heap ...

    java poi 读取百万数据OOM优化

    本篇文章将重点讨论如何使用Java的Apache POI库以及两种不同的解决方案——EasyExcel和xlsx-Streamer来高效地读取大量Excel数据,避免OOM。 首先,Apache POI是Java中广泛使用的API,用于读写Microsoft Office格式...

    如何排查weblogic内存不足

    * Java 堆中的内存不足:如果 JVM 不能在 Java 堆中获得更多内存来分配更多 Java 对象,将会抛出 Java 内存不足 (Java OOM) 错误。 * 本地堆中的内存不足:如果 JVM 无法获得更多本地内存,它将抛出本地内存不足...

    OOM分析工具-MemoryAnalyzer.zip

    《Java OOM问题分析利器:Memory Analyzer Tool (MAT)》 在Java开发过程中,内存管理是至关重要的一环,尤其对于大型、高并发的应用来说,内存溢出(Out of Memory,简称OOM)问题可能导致系统崩溃,严重影响服务...

    MemoryAnalyzer独立版

    《深入理解Java OOM分析与MemoryAnalyzer工具》 在Java编程中,内存管理是至关重要的一个环节,不当的内存使用可能导致程序性能下降,甚至出现“OutOfMemoryError”(简称OOM)异常,严重影响服务的稳定性和可靠性...

    KOOM:KOOM是Kwai在移动平台上的OOM杀手

    implementation ' com.kwai.koom:java-oom:1.0.7 ' } 快速教程 您可以在要启动内存监视时立即设置KOOM,在应用程序启动时进行设置,您可以像这样: public class KOOMApplication extends Applicat

    java 内存溢出分析工具 HeapAnalyzer

    Java内存溢出(Out of Memory,OOM)是Java应用程序中常见的问题,会导致程序崩溃或性能急剧下降。HeapAnalyzer是一款强大的工具,专为分析Java应用程序的内存状况,特别是针对内存溢出问题进行诊断。本文将详细介绍...

    郑州电票内存溢出分析方法和结果

    【郑州电票内存溢出分析方法和结果】的讨论主要集中在如何分析和处理Java应用程序中的内存溢出(OOM)问题。内存溢出是由于程序在运行过程中分配的内存超过了系统可提供的内存,导致系统崩溃或者性能急剧下降的现象...

    快速简单避免OOM的java处理Excel工具

    "快速简单避免OOM的java处理Excel工具"可能指的是阿里巴巴的EasyExcel,这是一个专门为了解决Java处理Excel时的内存问题而设计的开源项目。EasyExcel基于Apache POI,但优化了内存使用,尤其适用于大数据量的读写...

    内存不足OOM java.lang.OutOfMemoryError.

    Java中的“内存不足OOM (Out Of Memory):java.lang.OutOfMemoryError”是一个常见的运行时错误,它表示Java虚拟机(JVM)在尝试分配新的对象或数据结构时,发现系统内存不足以完成此操作。这个问题通常发生在程序...

    Groovy大量计算导致oom的解决办法

    问题原因分析:使用ScriptEngine.eval每次都会对脚本进行编译,生成一个新的类,被GroovyClassLoader加载,大量执行计算后,将导致被加载的类数量不断增加,最终OOM。 解决办法:对计算的表达式expression进行预...

    Weblogic内存大小配置

    1. **确定是Java OOM还是本地OOM**:通过分析日志文件,可以初步判断是Java堆内存不足还是本地内存不足。 2. **Java OOM**:检查-Xmx参数是否设置合理,监控应用的内存使用情况,分析堆内存快照查找内存泄漏源。 3...

    OOM java分析mat工具

    当Java应用抛出OOM异常时,通常意味着系统已经耗尽了所有可用内存,无法为新的对象分配空间。这时,MAT工具就显得尤为重要。 MAT提供了多种功能来帮助分析OOM问题: 1. **堆转储分析**:当遇到OOM时,可以使用JVM...

    安卓内存OOM分析

    在安卓系统中,"OOM"(Out of Memory)是指应用程序因为消耗了过多的内存而被系统强制终止,这是安卓开发者需要特别关注的问题。本篇将深入探讨安卓内存OOM的分析和解决策略,以及如何通过内核剖析来预防和处理此类...

    java入门、java内存区域和OOM、垃圾回收器和垃圾回收策略

    本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...

Global site tag (gtag.js) - Google Analytics