今天博客访问出现了点问题。就是在后台登录的时候,登录不了,出现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"