`
javasogo
  • 浏览: 1816577 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

探究java.lang.OutOfMemoryError: PermGen space

阅读更多

近日,tomcat6下,同时发布多个app(实际上就两个app,这两个app之间通过WebService互相访问,另外有三个Socket服务端监听),系统启动的时候No problem。but系统运行时总是抛出java.lang.OutOfMemoryError: PermGen space。
根据以往经验,调大java的-Xss参数,可是增大至16M时,仍然一如既往的throw Exception。如此,若何?
Google后,得知是因为JVM中的permanent heap溢出。根本原因原来是Java虚拟机的设计问题,SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!(这个问题在spring的论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。)而且这个bug早在2003年就有人提出了,but Sun好像一直没有解决这个问题呢。
So,没法回收就给它放大!怎么放大呢?
-XX:MaxNewSize=256M -XX:MaxPermSize=256M
另外:PermGen space 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)那么就会产生此错误信息了。
Tomcat下修改此问题:
Windows下,在文件{tomcat_home}/bin/catalina.bat
在文件开头可增加如下设置:
set JAVA_OPTS=-Xms512m -Xmx512m -Xss1024k -XX:MaxNewSize=256M -XX:MaxPermSize=256M
Unix/Linux下,在文件{tomcat_home}/bin/catalina.sh的前面,可增加如下设置:
JAVA_OPTS='-Xms512m -Xmx512m -Xss1024k -XX:MaxNewSize=256M -XX:MaxPermSize=256M'
各参数释义:
-Xms:程序初始化的时候内存栈的大小。
-Xmx:应用程序(不是jvm)能够使用的最大内存数,这个值也不应该设置过大,超过机器内存。否则,tomcat会无法启动。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xss:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M。
-XX:MaxPermSize:设置持久代大小
-XX:NewSize:设置年轻代大小
此处涉及到java虚拟机以及垃圾回收机制的问题,本文不做详细介绍,请直接咨询google。

Eclipse下修改参数的步骤:

Window-->Preference-->Java-->InstalledJREs

选中正在使用中的JRE,单击“Edit”,在“Default VM Argument”中,录入:-Xms256M -Xmx1024M -Xss1024k -XX:MaxPermSize=256M

OK

分享到:
评论

相关推荐

    java.lang.OutOfMemoryError: PermGen space解决方案

    java.lang.OutOfMemoryError: PermGen space 解决方案

    Caused by: java.lang.OutOfMemoryError: PermGen space解决方案

    在Java应用程序运行过程中,"java.lang.OutOfMemoryError: PermGen space"错误是常见的一个问题,尤其是在使用Tomcat这样的Java应用服务器时。这个错误表明应用程序在 PermGen 区域(Permanent Generation)耗尽了...

    java.lang.OutOfMemoryError: PermGen space及其解决方法

    ### Java.lang.OutOfMemoryError: PermGen space 及其解决方法 #### 一、PermGen space 概述 在Java虚拟机(JVM)中,PermGen space(永久代)是用于存储类的信息、常量、静态变量等数据的区域。在Java 8之前,Perm...

    Eclipse中通过Tomcat运行J2EE项目java.lang.OutOfMemoryError PermGen space的解决方案

    Eclipse 中通过 Tomcat 运行 J2EE 项目 java.lang.OutOfMemoryError PermGen space 的解决方案 在 Eclipse 中通过 Tomcat 运行 J2EE 项目时,可能会出现 java.lang.OutOfMemoryError: PermGen space 异常,这是由于...

    java.lang.OutOfMemoryError: PermGen space

    在Java编程中,我们常常会遇到一个让人头疼的问题,那就是“java.lang.OutOfMemoryError: PermGen space”错误。这个错误提示表明,应用程序在运行过程中,内存的永久代(Permanent Generation)空间不足,导致了...

    Tomcat给我的java.lang.OutOfMemoryError: PermGen

    本文将针对两种常见的Java内存溢出错误——`java.lang.OutOfMemoryError: PermGen space`和`java.lang.OutOfMemoryError: Java heap space`进行详细的分析和解决方案的探讨。 首先,我们来看`java.lang....

    java.lang.OutOfMemoryError处理错误

    在Tomcat中java.lang.OutOfMemoryError: PermGen space异常处理: 1. PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的。 2. Class在被Loader...

    java.lang.OutOfMemoryError解决办法

    当应用程序加载大量类或者使用了大量的静态变量和常量时,PermGen space可能会耗尽,从而引发`java.lang.OutOfMemoryError: PermGen space`错误。对于频繁部署或重载JSP的Web应用,如Tomcat,这个问题尤为常见。 ...

    tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space

    tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space 参考该文档可快速解决内存溢出的问题,服务器:tomcat

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

    ### Myeclipse下java.lang.OutOfMemoryError: Java heap space的解决方案 在使用Myeclipse进行Java开发时,可能会遇到`java.lang.OutOfMemoryError: Java heap space`这个错误提示。这种异常通常发生在应用程序占用...

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    4. **调整PermGen空间**:在Java 8之前, PermGen 区域用于存储类的元数据,如果这个区域耗尽,会出现`java.lang.OutOfMemoryError: PermGen space`错误。在Java 8中,这部分被MetaSpace取代,可通过`-XX:...

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

    5. **增大PermGen或Metaspace大小**:如果你看到 `OutOfMemoryError: PermGen space` 或 `Metaspace`,这是方法区溢出,可以通过 `-XX:MaxPermSize` (对于老版本JVM) 或 `-XX:MaxMetaspaceSize` (对于Java 8及以后...

    OutOfMemoryError_8种典型案例分享

    当堆内存不足以容纳新对象时,就会抛出java.lang.OutOfMemoryError: Java heap space错误。常见的解决方法是增加-Xmx参数值以扩大堆内存的大小。除此之外,还可能是由于代码问题导致内存消耗过大,例如内存泄漏或是...

    内存不足OOM java.lang.OutOfMemoryError.

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

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

    - **解决方法**:Java 8之后,PermGen被Metaspace取代,处理方式类似。可以增加 Metaspace 的大小(`-XX:MaxMetaspaceSize`),或者限制加载的类数量,避免频繁加载新类。 在针对`OutofMemoryError`进行故障排查时...

    Tomcat–Java.Lang.OutOfMemoryE

    标题 "Tomcat–Java.Lang.OutOfMemoryError" 指的是在使用Apache Tomcat服务器运行Java应用程序时出现的一种常见错误,即“Java.lang.OutOfMemoryError”,特别是涉及到“PermGen Space”区域的问题。 PermGen...

    java内存溢出原因

    - **错误日志**:`java.lang.OutOfMemoryError: PermGen space` - **原因**:默认的PermGen大小有限,如果加载的类数量过多,超过了这个限制,就会发生溢出。 - **解决方案**:可以通过设置JVM启动参数增大Perm...

    关于java堆内存溢出的几种情况

    【情况三】:`java.lang.OutOfMemoryError: PermGen space` 此错误是因为持久代(PermGen)内存不足。在Java 8之前,PermGen用于存储类元数据和静态变量,当类加载过多或存在内存泄漏时可能发生溢出。解决方案是通过...

    java.lang.OutOfMemoryError 错误整理及解决办法

    Java中的`java.lang.OutOfMemoryError`是一个严重的问题,它表示Java虚拟机(JVM)在尝试分配新的对象时没有足够的内存。这个错误通常会导致应用程序崩溃。本文将深入探讨这种错误的原因、常见类型以及解决策略。 *...

Global site tag (gtag.js) - Google Analytics