在使用
Java
程序从数据库中查询大量的数据或是应用服务器
(
如
tomcat
、
jboss,weblogic)
加载
jar
包时会出现
java.lang.OutOfMemoryError
异常。这主要是由于应用服务器的内存不足引起的。这种异常常有以下几种情况(以下以
tomcat
环境为例,其它
WEB
服务器如
jboss,weblogic
等是同一个道理):
1.
java.lang.OutOfMemoryError: PermGen space
PermGen space
的全称是
Permanent Generation space
,是指内存的永久保存区域
OutOfMemoryError: PermGen space
。从文字上看就是内存溢出,解决方法是加大内存。为什么会内存溢出,这是由于这块内存主要是被
JVM
存放
Class
和
Meta
信息的,
Class
在被
Load
的时候被放入
PermGen space
区域,它和存放
Instance
的
Heap
区域不同
,GC(Garbage Collection)
不会在主程序运行期对
PermGen space
进行清理,所以如果你的
APP
会
LOAD
很多
CLASS
的话,就很可能出现
PermGen space
错误。这种错误常见在
web
服务器对
JSP
进行
pre compile
的时候。如果你的
WEB APP
下都用了大量的第三方
jar,
其大小超过了
jvm
默认的大小
(4M)
那么就会产生此错误信息了。
解决方法:
手动设置
MaxPermSize
大小
a.
如果
tomcat
是以
bat
方式启动的,则如下设置:
修改
TOMCAT_HOME/bin/catalina.sh
在
“echo "Using
CATALINA_BASE: $CATALINA_BASE"”
上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=512m -XX:MaxPermSize=512m
b.
如果
tomcat
是注册成了
windows
服务,以
services
方式启动的,则需要修改注册表中的相应键值。
打开注册表,找到目录
HKEY_LOCAL_MACHINE\SOFTWARE\Apache
Software Foundation\Procrun 2.0\htfty\Parameters\Java
,其中目录地址中红色标注的(如
htfty
)需要根据不同情况作修改,为
tomcat
服务注册成
windows
服务的名称。
可以看到
JvmMs
和
JvmMx
项,其中
JvmMs
设置最小的内存使用参数,
JvmMx
设置最大的内存使用参数。设置好
JvmMs
和
JvmMx
项的值,重启
tomcat
服务器即可生效。
建议:将相同的第三方
jar
文件移置到
tomcat/shared/lib
目录下,这样可以达到减少
jar
文档重复占用内存的目的。
2.
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
a.
如果
tomcat
是以
bat
方式启动的,则如下设置:
修改
TOMCAT_HOME/bin/catalina.sh
在
“echo "Using
CATALINA_BASE: $CATALINA_BASE"”
上面加入以下行:
set JAVA_OPTS=-Xms512m
-Xmx512m
b.
如果
tomcat
是注册成了
windows
服务,以
services
方式启动的,则需要修改注册表中的相应键值。
打开注册表,找到目录
HKEY_LOCAL_MACHINE\SOFTWARE\Apache
Software Foundation\Procrun 2.0\htfty\Parameters\Java
,其中目录地址中红色标注的(如
htfty
)需要根据不同情况作修改,为
tomcat
服务注册成
windows
服务的名称。
可以看到
JvmMs
和
JvmMx
项,其中
JvmMs
设置最小的内存使用参数,
JvmMx
设置最大的内存使用参数。设置好
JvmMs
和
JvmMx
项的值,重启
tomcat
服务器即可生效。
提示:
Heap Size
最大不要超过可用物理内存的
80
%,一般的要将
-Xms
和
-Xmx
选项设置为相同,而
-Xmn
为
1/4
的
-Xmx
值。