解决eclipse报PermGen space内存溢出异常的问题

异常问题如下所示:

1.点击Eclipse->Window->Preferences,如下所示:

2.点击Server->Runtime Environments,选择Apache Tomcat v7.0,点击Edit按钮,如下图所示:

3.选择运行的JRE,点击Installed JRES,如下图所示:

4.选中jdk1.7.0_67,点击Edit,如下图所示:

5.找到Default VM Arguments,在输入框中输入:-Xms512M -Xmx1024M  -XX:MaxPermSize=512m,然后finish->OK->OK。

接下来说点理论的问题:内存溢出类型

1. java.lang.OutOfMemoryError: PermGen space

JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

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死掉的情况)

set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

2.java.lang.OutOfMemoryError: Java heap space

第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。

注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。

垃圾回收GC的角色

JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:

当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。

根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。

为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收,

一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。

时间: 2024-10-07 13:26:37

解决eclipse报PermGen space内存溢出异常的问题的相关文章

怎么解决eclipse报PermGen space异常的问题

最近使用eclipse做开发,使用的服务器是tomcat,但在启动时报了Caused by: java.lang.OutOfMemoryError: PermGen space的异常. 这个错误很常见,于是配置tomcat下的catalina.bat,配置eclipse.ini,各种方法都用过了,不管用!花了好长时间,在几近崩溃的时候找到了下面的解决办法,终于解决了. 为了不走弯路,我把三种方法都写写,我用的是第三种方法才解决的. 第一种方法:修改tomcat/bin目录下的catalina.b

解决eclipse报PermGen space异常(内存溢出)的问题

第一种方法:修改tomcat/bin目录下的catalina.bat. 在"rem ----- Execute The Requested Command ----------------------"下加入JAVA_OPTS="-server -Xms800m -Xmx800m -XXNewSize=256M -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m"这种方法在只使用tomcat时管用,但

解决Myeclipse报PermGen space异常的问题

最近使用eclipse做开发,使用的服务器是tomcat,但在启动时报了Caused by: java.lang.OutOfMemoryError: PermGen space的异常. 这个错误很常见,于是配置tomcat下的catalina.bat,配置eclipse.ini,各种方法都用过了,不管用!花了好长时间,在几近崩溃的时候找到了下面的解决办法,终于解决了. 为了不走弯路,我把三种方法都写写,我用的是第三种方法才解决的. 方法/步骤 1 第一种方法:修改tomcat/bin目录下的ca

内存溢出异常

Java堆 存储对象实例,我们只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象达到最大堆容量限制后产生内存溢出异常. java.lang.OutOfMemoryError:Java heap space. 原因分析:确认内存中对象是否是必要的.也就是首先要分清楚到底是出现了内存泄露还是内存溢出. 内存映像分析工具,检查是否是内存泄露,还是内存溢出. 2.4.2 虚拟机栈和本地方法栈溢出 本地变量表.StackOverflowError异常.

2.java内存区域与内存溢出异常

2.1:概述 对于从事C.C++程序开发的开发人员来说,对象的新建内存区域和销毁内存区域(new和delete)都是由程序员手动调用的.java的内存管理是由虚拟机自动执行的.一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的工作. 2.2:.运行时的数据区域 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.每条线程都需要有一个独立的程序计数器,各条线程之间计数

Java虚拟机结构及常见内存溢出异常

每个Java虚拟机都有一个类加载器子系统,根据某个全限定名来装入类型,同样每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令. 当虚拟机运行一个程序时,就需要从已加载的文件中得到信息,将这些信息组织到运行时数据区,以便于管理. Java运行时的数据区域划分 1.程序计数器:程序计数器是一块较小的内存空间,可以看做是当前线程的字节码的行号指示器. Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个时刻,一个处理器只会执行一条线程中的指

Java虚拟机-内存溢出异常

内存泄露与内存溢出 内存泄露一般是代码设计存在缺陷导致的,指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存.即被分配的对象可达但是已经无用:通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码水平: 内存泄露的几种场景:1.长生命周期的对象持有短生命周期对象的引用      例如:在全局静态map中缓存局部变量,且没有清空操作,随着时间的推移,这个map会越来越大,造成内存泄露:2.修改hashset中对象的参数值,且参数是计算哈希值的字段     当一个

Java自动内存管理机制学习(一):Java内存区域与内存溢出异常

备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.如下图所示: 2.1.1 程序计数器 程序计数器是一块较小的内存空间,它是线程的私有内存,可以看作时当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去

深入理解java虚拟机学习 笔记 第二章 java 内存区域和内存溢出异常

2.2 运行时区域 java虚拟机划分成若干个不同的数据区域, 1.程序计数器,字节码解释器工作时就是通过改变计数器的值来取吓一跳需要执行的字节码命令 了解 String.intern()方法 作用: 如果字符串常量池中一个包含了一个等于此String对象的字符串,则返回代表池中的这个字符串的String对象,否则将此对象包含的字符串添加到常量池中,并返回此String对象的引用. 实战 将堆的最小值 -Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展  通过参数 -XX:+HeapD