`
shutiao2008
  • 浏览: 208808 次
  • 性别: 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
分享到:
评论

相关推荐

    PermSize内存设置方法.docx

    这是我自己整理的PermSize内存设置方法,有需要的朋友可以参考一下

    eclipsejetty 3.8.0 eclipse的jetty8插件 离线安装包

    提醒1>记得给你的jetty容器分配内存,这个独立不和eclipse共享的。解决方法:Run->Debug Configurations ...->双击Jetty Webapps下你的项目->Arguments->VM arguments根据你的应用分配内存。例如8G内存可考虑:-Xms...

    Tomcat内存溢出的三种情况及解决办法分析

    Tomcat内存溢出的三种情况及解决办法分析 Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个...

    eclipse配置文件

    Preference java Code Style Formatter import导入文件,重新配置eclipse

    Eclipse 启动运行速度调优

    运行参数如下: eclipse.exe -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M <br>-------------- <br>JVM 提供了各种用于调整内存分配和垃圾回收行为的标准开关和非标准...

    认识 java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 区别

    关于内存溢出报错的处理及解决方案: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemory 堆内存、非堆内存都描述

    eclipse防止自动退出的优化启动的批处理

    众所周知,eclipse有bug,不使用优化启动的话经常会耗尽内存自动退出。 <br>优化的方法有建立快捷方式然后跟参数-vmargs -Xms128m -Xmx512m -XX:PermSize=128m -XX:PermSize=256m,比较麻烦。所以用现成的配置好...

    eclipse自动部署

    -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m -Drebel.spring_plugin=true -Drebel.aspectj_plugin=true -Drebel.struts2_plugin=true -Drebel.ibatis_plugin=true -Drebel.mybatis_plugin=true -java...

    java.lang.OutOfMemoryError解决办法

    报错 java.lang.OutOfMemoryError: PermGen space 报错 java.lang.OutOfMemoryError: Java heap 启动报错java.lang.ClassNotFoundException: 1catalina.org.apache.juli.FileHandler JAVA_OPTS="-server -Xms800m ...

    扩大Tomcat内存

    打开tomcat目录下\bin\tomcat7w.exe,点击Java选项卡,然后将会发现其中有这么两项:Initial memory pool和Maximum memory pool,其中Initial memory pool这个就是初始化设置的内存的大小。Maximum memory pool这个...

    修改JVM内存

    TOMCAT JVM JAVA 内存 更改JVM 内存大小 TOMCAT JVM 更改 TOM

    优化Tomcat配置(内存、并发、缓存等方面)方法详解

    Tomcat有很多方面,我从内存、并发、缓存等方面介绍优化方法。...-XX: PermSize 内存永久保留区域 -XX:MaxPermSize 内存最大永久保留区域 服务器参数配置 现公司服务器内存一般都可以加到最大2G ,所以

    后台管理系统

    更低版本的JDK6、JDK7可能需要设置Java内存-XX:PermSize=128M -XX:MaxPermSize=512M,否则可能出现这种类型的内存溢出:java.lang.OutOfMemoryError: PermGen space。 Servlet2.5或更高版本(如Tomcat6或更高版本)。...

    myeclipse的优化

    实在忍无可忍,作者收集了一些关于解决 MyEclipse 的耗内存的办法,经本人测试非常有效,共享出来,希望可以方便更多的朋友。 1 老是弹出Quick update error 、关闭myeclipse的Quick Update自动更新功能 这个...

    Linux和Windows中tomcat修改内存大小的方法

    其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置 实例,以下给出1G内存环境下java jvm 的参数设置参考: 代码如下:JAVA_OPTS=”-server -Xms...

    weblogic92 启动慢解决办法

    使用SUN JDK 启动时要很长时间,但启动启来weblogic正常. 特征见下面标红部分,时间很长. ...JAVA Memory arguments: -Xms 256m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=48m -XX:MaxPermSize=128m

    tomcat6.0 /7.0安装版内存溢出设置方法

    下面是使用服务形式启动tomcat6.0的内存配置方法: D:\Program Files\Apache Software Foundation\Tomcat 6.0\bin下打开tomcat6w.exe,切换到java选项卡 在Java Options选项的最后面加入(这个和修改注册表的效果...

    jspxcms:java 新闻发布系统

    更低版本的JDK7可能需要设置Java内存-XX:PermSize=128M -XX:MaxPermSize=512M,否则可能出现这种类型的内存溢出:java.lang.OutOfMemoryError: PermGen space。 Servlet3.0或更高版本(如Tomcat7或更高版本)。 ...

    xmljava系统源码-cs_singlewindow_cms:统一门户CMS系统

    本源码包采用maven结构,和普通eclipse的web项目结构不一样,且不包含lib目录下的第三方jar包。 环境要求 JDK7或更高版本(支持JDK8)。建议使用JDK8,有更好的内存管理。更低版本的JDK7可能需要设置Java内存-XX:...

    resin-jvm 调优

    不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。 在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能。有些垃圾收集专用于特殊的应用程序。比如,实时应用程序主要是为了...

Global site tag (gtag.js) - Google Analytics