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

Eclipse报告内存不足和PermSize space错误,Eclipse死掉的解决办法

阅读更多
这一段时间,Eclipse总是死掉,几乎是稍微操作快一点就会死掉,几分钟一次,搞得人郁闷至极。浪费了不少时间,在网上搜了下,看到很多朋友也出现类似的情况,在网上求救,但是网上的办法都只是说通过修改eclipse.ini文件来加大Eclipse的内存。

自己试了下,发现不管用。今天,又死掉了,不过爆出一个经常出现的错误,大意是:permgen space导致内存溢出。实在忍无可忍,上网一搜,发现网络真是个好东西,尤其是对我们这种自学者而言,无疑是授业解惑的良师益友。

这里总结一下自己的经验和网友的经验,希望能够对受此问题折磨的朋友有所参考价值。

解决办法如下:

在eclipse.ini配置文件中加上以下两行
-XX:PermSize=128M
-XX:MaxPermSize=128M

加上上2行后,我的eclipse.ini文件如下所示:

-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
-vmargs
-Xms256m
-Xmx512m
-XX:PermSize=128M
-XX:MaxPermSize=128M

这里的内存大小根据自己的物理内存情况来决定吧。

从网上的资料看PermSize大一点肯定更好,而且最好是设置PermSize和MaxPermSize一样大。理由如下:
        PermSize 和MaxPermSize如果设置为相同还可以在一定程度上提高性能,因为,PermSize在不断的变化中会需要转移其中的数据。如果固定了以后,则可以减少每次扩大PermSize带来的性能损失。


1、PermGen space简介

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。

说说为什么会内存益出:
(1)这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同。
(2)GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。

如果你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

解决方法: 手动设置MaxPermSize大小

修改TOMCAT_HOME/bin/catalina.sh,在echo "Using CATALINA_BASE:   $CATALINA_BASE"上面加入以下行:
       JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以减少jar 文档重复占用内存。


2、转载:OutOfMemory:PermGen Space异常的处理和分析

Java程序员没有遇到过OutOfMemory简直就是不可能的事情!

可见在Java的世界中,太多的不确定因素导致Java运行程序直接崩溃,直接抛出OutOfMemory异常,而一旦遇到了这个问题,调查起来就非常的困难。在JDK 5.0以前,OutOfMemory只有这么一句话: java.lang.OutOfMemory Exception…基本上无从下手,无从分析。从JDK 5.0以后对OutOfMemory增加了许多的详细说明,为这个异常的分析提供了很大的便利。

这次遇到的问题就是会抛出OutOfMemory:PermGen Space的异常,这个异常非常有意思,根据【此文章】的描述,这是一个Sun JVM的bug,从2003年开始,一只到现在都没有解决。而且提出来的解决方案是使用JRockit。Bug产生的原因已经找到,就是因为JVM在分配PermGen Space的时候出现了PermGen Space不足的情况,默认情况下 PermGen的大小为64M,在不换用JRockit的情况下,可以在启动JVM的时候添加一个参数: -XX: MaxPermSize= 128m| 256m| 512m。

那么究竟什么是PermGen呢?

PermGen 原来是指Permanent Generation,本身是在Java的垃圾收集机制(GC)中产生的一个概念。Java的垃圾收集机制最早只是遍历所有的对象,如果发现某个对象没有被引用,则回收,这是在早期的Java 1.0和Java 1.1的时候的GC规则。慢慢的,这样一种“愚蠢的”GC算法成为了JVM性能的瓶颈,在拥有大量数据的Java应用程序中,GC的算法被高度强化,于是各种各样高效的JVM GC算法被发展了起来。从J2SE也就是Java 1.2开始,JVM引入了多种GC算法,其中一种用的非常多的就是Generational Collection,中文也叫做“分代收集法”。

分代收集法摈弃了对所有对象的遍历,而是采用一些经验属性去避免额外的工作(While naive garbage collection examines every live object in the heap, generational collection exploits several empirically observed properties of most applications to avoid extra work)。其中导入了一个非常关键的概念:infant mortality (幼儿死亡率),这表示越是新生成的变量或者对象,越容易被收集。下面一张图表示了对象的生命周期,横轴表示的是测试到对象的生命周期,纵轴表示在一个指定的生命周期上被回收的对象数量。




可以看到,在使用了分代收集法以后,年轻一代的对象被收集的比例最高。并且在内存中的对象会按照不同的“年龄”来划分,当一个年龄段的对象满了以后,在这个年龄段上就会发生垃圾收集,从最年轻的一代开始,一直到“永生代”,在内存中,所有的对象可以划分为很多代,最后的一代“永生代”就是“Permanent Generation”,这里就是直接引出“Permanent Generation”概念的地方。具体可以参考下图:



根据前面所说的情况,在分代垃圾收集的情况下会产生Permanent Generation的概念,而这个分代垃圾收集法是并行收集和并发收集的基础,所以Permanent Generation会一直存在,那么这个Permanent Generation究竟是做什么用的呢?这里保存了JVM中所有对象的类信息,包括类的元数据,还有方法描述等等,所以这一代内存垃圾收集算法是不一样的,在Java大程序的情况下,尤其是J2EE 或者说Java EE的大型应用程序上,Permanent Generation的大小会直接限定能载入类的数量和大小。

【解决办法】就是设定JVM启动的时候参数,可以如下设置:

java -XX: PermSize=64m -XX: MaxPermSize=128m

另外PermSize 和MaxPermSize如果设置为相同还可以在一定程度上提高性能,因为,PermSize在不断的变化中会需要转移其中的数据。如果固定了以后,则可以减少每次扩大PermSize带来的性能损失。

更多的请参考 【Java官方站点】

另外,还可以在Java启动的时候添加下面的参数来看GC的运行情况:

Java -verbosegc

来源:http://www.mantis.org.cn/simple/index.php?t278.html
分享到:
评论

相关推荐

    eclipse 内存不足的问题

    ### Eclipse 内存不足问题详解及解决方案 #### 一、问题背景 在使用Eclipse进行软件开发时,可能会遇到一个常见的问题:Eclipse提示“内存不足”。这种情况通常发生在处理大型项目或者开启多个工作空间时。当...

    Eclipse的内存优化与内存不足问题.pdf

    通过合理的配置JVM参数,尤其是调整PermGen Space的大小,可以有效解决Eclipse中的内存不足问题。此外,还应注意优化项目的第三方库管理,减少不必要的类加载,从而进一步提升Eclipse的稳定性和性能。 总之,正确地...

    eclipse 内存溢出解决办法

    ### Eclipse 内存溢出解决办法详解 #### 一、PermGen Space 概念与问题成因 在Java虚拟机(JVM)中,PermGen Space(Permanent Generation Space)是专门用于存储Class和Meta信息的一个区域。当一个Class被加载到...

    eclipse和tomcat的内存配置

    - **定期监控内存使用情况**:通过监控工具如Windows任务管理器或Linux的top命令等,定期检查Eclipse和Tomcat的内存使用情况,以便及时发现并解决问题。 - **优化代码结构**:除了调整JVM参数外,优化代码结构也是...

    tomcat_eclipse配置内存溢出

    对于`PermGen space`错误,主要原因是永久代(PermGen space)内存不足。永久代主要用于存储类的信息、常量、静态变量等数据。当应用加载的类较多或者单个类占用的空间较大时,如果没有适当调整永久代的大小,就很...

    eclipse内存溢出报错-解决办法

    然而,在使用过程中,用户可能会遇到“eclipse内存溢出报错”的问题,这一现象通常表现为Java.lang.OutOfMemoryError: Java heap space错误,这主要源于Eclipse运行时分配给Java虚拟机(JVM)的内存不足,导致程序...

    eclipse内配置处理内存溢出

    这类错误通常发生在Java虚拟机(JVM)无法为新对象分配足够的内存空间时,常见原因包括堆内存不足、永久代(Permanent Generation)空间不足等。本文将详细介绍如何在Eclipse环境中调整JVM参数以避免内存溢出问题,...

    系统内存不足引起异常的解决方法

    ### 系统内存不足引起异常的解决方法 #### 背景介绍 在日常工作中,尤其是在进行软件开发或运行大型应用程序时,我们经常会遇到由于系统内存不足而导致的异常情况。其中最常见的异常之一就是`java.lang....

    解决Java_heap_space问题

    当程序创建的对象过多或单个对象占用内存过大时,如果没有足够的空闲内存来分配新对象,JVM就会抛出“OutOfMemoryError: Java heap space”错误。这可能是由于以下原因造成的: 1. **初始堆大小设置不当**:默认...

    eclipse_failed_to_create_the_java_virtual_machine_问题图文解析_收藏

    PermSize 和 MaxPermSize 的设置应该根据实际情况进行调整,太小可能会导致 java.lang.OutOfMemoryError: PermGen space。 重启 Eclipse 后,该问题应该解决。 其他解决方法 除了修改 eclipse.ini 文件外,还可以...

    Eclipse全面提速小技巧.zip

    在旧版JVM中, PermGen 是用于存储类元数据的空间,如果不足,会导致"OutOfMemoryError: PermGen space"错误。因此,适当增加 PermSize 和 MaxPermSize 参数(如"-XX:MaxPermSize=512m")有助于预防这类问题。 "**4...

    eclipse与tomcat的JVM设置

    ### Eclipse与Tomcat的JVM设置详解 #### 一、引言 在开发Java应用程序时,经常需要使用...通过以上步骤,开发者可以有效地解决由JVM内存配置不当导致的问题,确保Java应用程序在Eclipse和Tomcat环境下能够正常运行。

    eclipse常见报错

    eclipse常见报错解决方法大全 Eclipse 是一个功能强大的集成开发环境,但是在使用过程中,经常会遇到一些报错问题。以下是常见的 Eclipse 报错解决方法: 1. Tomcat 服务器运行一段时间,总是会自动报异常:java....

    could not create the java virtual machine 解决办法

    ### "could not create the java virtual machine" 解决办法 在开发过程中,我们经常会遇到 “could not create the java virtual machine” 这样的错误提示。这个问题通常出现在启动基于Java的应用程序时,比如...

    myeclipse内存溢出问题

    ### MyEclipse内存溢出问题解析与解决策略 #### 一、问题背景 在使用MyEclipse集成开发环境(IDE)进行项目开发时,开发者可能会遇到内存溢出的问题。这通常表现为应用程序运行过程中突然出现错误提示,导致程序...

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

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

    扩大Tomcat内存

    然而,默认情况下,Tomcat分配给Java虚拟机(JVM)的内存是有限的,这在处理大型应用或高并发请求时可能会导致内存不足的问题。本文将详细介绍三种常见的增加Tomcat内存的方法,并对相关参数进行深入解释。 #### 二、...

    FlashBuilder提示Fail to create the Java Virtual Machine

    `-XX:MaxPermSize`和`-XX:PermSize`则用于指定永久代(PermGen space)的最大和初始大小。根据实际情况调整这些值,确保有足够的内存供JVM使用。 3. **验证环境变量**: - 检查系统的环境变量设置,确保JAVA_HOME...

    jeecg常见问题

    Eclipse在运行Java应用时可能会遇到内存溢出问题,这通常是因为JVM可用内存不足导致的。 **错误信息**: ``` 2014-6-27 15:29:21 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler process 严重:...

Global site tag (gtag.js) - Google Analytics