在使用
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
值。
分享到:
相关推荐
### 解决OutOfMemoryError: PermGen space 在Java应用程序运行过程中,可能会遇到...本文提供的解决方案包括调整PermGen space的大小、优化代码、使用JConsole监控内存等,希望能帮助开发者们快速定位并解决问题。
解决 Eclipse 中通过 Tomcat 运行 J2EE 项目 java.lang.OutOfMemoryError PermGen space 的关键是增加 JVM 的内存空间,通过添加合适的参数,可以避免 PermGen space 溢出,确保项目的稳定运行。
总之,"java.lang.OutOfMemoryError: PermGen space"错误是由于Java虚拟机的 PermGen 区域内存不足造成的,可以通过增大 PermGen 区域的大小、升级JVM版本、优化类加载和库的使用等方式来解决。对于任何内存管理问题...
### Java.lang.OutOfMemoryError: PermGen space 及其解决方法 #### 一、PermGen space 概述 在Java虚拟机(JVM)中,PermGen space(永久代)是用于存储类的信息、常量、静态变量等数据的区域。在Java 8之前,Perm...
java.lang.OutOfMemoryError: PermGen space 解决方案
解决 JVM 中的 PermGen space 问题 PermGen space(Permanent Generation space)是 JVM 中的一块永久保存区域,用于存放 Class 和 Meta 信息。当应用程序加载 Class 时,Class 就会被放入 PermGen space 区域中,...
在Java虚拟机(JVM)中,PermGen Space,全称Permanent Generation Space,是用于存储类的元数据、常量池、字符串常量等非实例对象数据的一个内存区域。与普通对象的堆空间不同,PermGen Space主要负责存储类的结构...
### OutOfMemoryError: PermGen space 错误详解与解决方案 #### 一、问题背景及症状 在开发或运行基于Java的应用程序时,有时会遇到一个常见的错误提示:“OutOfMemoryError: PermGen space”。该错误通常发生在...
tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space 参考该文档可快速解决内存溢出的问题,服务器:tomcat
Java内存不足PermGen space错误通常出现在Java程序运行过程中,尤其是当Java EE服务器(如Tomcat、JBoss等)加载WAR或EAR包时。这个错误的根本原因在于Java虚拟机(JVM)的永久代(Permanent Generation Space)内存...
NULL 博文链接:https://eastzhang.iteye.com/blog/1788854
OutOfMemoryError: PermGen space异常是由于 PermGen space 内存溢出引起的。解决方法是手动设置MaxPermSize大小。在Tomcat以bat方式启动时,需要修改TOMCAT_HOME/bin/catalina.sh文件,加入以下行:`JAVA_OPTS="-...
总的来说,遇到`OutOfMemoryError: PermGen space`问题时,首先要分析应用是否频繁加载大量类或使用大量库,然后通过增大 PermGen 区域的大小来解决。此外,升级到Java 8及以上版本也是一个有效的解决方案,因为这些...
本文将针对两种常见的Java内存溢出错误——`java.lang.OutOfMemoryError: PermGen space`和`java.lang.OutOfMemoryError: Java heap space`进行详细的分析和解决方案的探讨。 首先,我们来看`java.lang....
3. **-XX:PermSize**:表示JVM永久代(PermGen space)初始大小。例如`-XX:PermSize=64M`表示JVM永久代初始大小为64MB。注意,从JDK 8开始,永久代被元空间(Metaspace)所替代。 4. **-XX:MaxPermSize**:表示JVM...