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

今天博客访问出现了点问题。就是在后台登录的时候,登录不了,出现HTTP500错误,问题的根源是:

Java.lang.OutOfMemoryError: PermGen space(解决办法在最后面

查了下资料是内存泄漏问题。


1、什么是内存泄漏?

概述:Java语言的一个关键的优势就是它的内存管理机制。你只管创建对象,Java的垃圾回收器帮你分配以及回收内存。然而,实际的情况并没有那么简单,因为内存泄漏在Java应用程序中还是时有发生的。

定义:对象已经没有被应用程序使用,但是JVM的垃圾回收机制没有办法移除它,因为它还在被其他对象引用着。

图解:理解这个定义需要先知道对象在内存中其实有三种状态被引用对象未被引用对象以及无用对象,如下图:

从上图我们能看出他们三者之间的关系:

①:未被引用对象会被垃圾回收器回收,而被引用的对象却不会。

②:未被引用的对象当然是不再被使用的对象,即无用对象,因为没有对象再引用它。

③:然而无用对象却不全是未被引用对象。其中还有一些被引用的。就是这种情况导致了内存泄漏。


2、为什么会发生内存泄漏?

如下图所示,举个栗子。A对象引用B对象,A对象的生命周期(t1-t4)比B对象的生命周期(t2-t3)长的多。当B对象没有被应用程序使用之后,A 对象仍然在引用着B对象。这样,垃圾回收器就没办法将B对象从内存中移除,从而导致内存问题,因为如果A引用更多这样的对象,那将有更多的未被引用对象存 在,并消耗内存空间。

甚至,B对象也可能会持有许多其他的对象,那这些对象同样也不会被垃圾回收器回收。所有这些没在使用的对象将持续的消耗之前分配的内存空间。


3、如何防止内存泄漏的发生?

①:首先明确一点,存在内存溢出的因不一定导致内存溢出的果(如内存溢出的因导致消耗的内存比较小或者运行时间短)。

②:程序中尽量少的使用static类型的全局变量,因为他们的生命周期和应用程序一样长。

③:特别注意事件监听和回调函数。当一个监听器在使用的时候被注册,但不再使用之后却未被反注册。

④:“如果一个类自己管理内存,那开发人员就得小心内存泄漏问题了。” 通常一些成员变量引用其他对象,初始化的时候需要置空。

⑤:大型项目上线前使用内存泄漏检测工具进行测试。


4、发生了内存泄漏怎么办?

第一种:修改自己代码

第二种:修改Web服务器配置

下面是经常发生的两种情况,使用修改Tomcat服务器的方法。


java.lang.OutOfMemoryError: 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)那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小

修改TOMCAT_HOME/ bin/catalina.sh(windows下是catalina.bat)
在# OS specific support.  $var _must_ be set to either true or false.上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128M"
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。


java.lang.OutOfMemoryError: Java heap space


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.sh(windows下是catalina.bat)
在# OS specific support.  $var _must_ be set to either true or false.上面加入以下行:  
JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"

你可能感兴趣的:(Java)