weblogic10.3 java.lang.OutOfMemoryError: PermGen space

本文介绍了在WebLogic 10.3.4上部署项目时遇到的PermGen内存溢出错误及其解决方法。通过调整WebLogic安装目录下的配置文件commEnv.cmd中PermGen空间的大小,成功解决了该问题。
 最近安装了WebLogic10.3.4,测试在weblogic上部署项目,没过多久就报错了:

weblogic.servlet.jsp.CompilationException: Failed to compile JSP /error.jsp Exception occurred while processing 'D:\JavaProject\struts2\webapp\error.jsp'java.lang.OutOfMemoryError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at weblogic.jsp.internal.jsp.JspJavaLanguageX.getTransform(JspJavaLanguageX.java:10) at weblogic.jsp.internal.jsp.JspScriptTransform.(JspScriptTransform.java:132) at weblogic.jsp.internal.jsp.JspCheckContext.check(JspCheckContext.java:82) at weblogic.jsp.internal.jsp.JspAnalyzer.check(JspAnalyzer.java:57) at weblogic.jsp.internal.ProxySourceFile._check(ProxySourceFile.java:136) at weblogic.jsp.internal.SourceFile.masterCheck(SourceFile.java:762) at weblogic.jsp.internal.SourceFile.check(SourceFile.java:314) at weblogic.jsp.internal.SourceFile.check(SourceFile.java:335) at weblogic.jsp.internal.ProxySourceFile.codeGen(ProxySourceFile.java:224) at weblogic.jsp.internal.SourceFile.codeGen(SourceFile.java:327) at weblogic.jsp.internal.client.ClientUtilsImpl$CodeGenJob.run(ClientUtilsImpl.java:599) at weblogic.jsp.internal.client.Job.performJob(Job.java:83) at weblogic.jsp.internal.client.ThreadPool$WorkerThread.run(ThreadPool.java:217)

上网查找说是要增大PermGen space的大小,但大部分都是修改tomcat的文章,最后找到http://darkjune.iteye.com/blog/178854才知道要在哪里修改。

方法:修改weblogic安装目录下wlserver\common\bin\commEnv.cmd,找到set MEM_ARGS=-Xms32m -Xmx200m -XX:MaxPermSize=128m,修改成set MEM_ARGS=-Xms256m -Xmx512m -XX:MaxPermSize=256m,可根据机器配置调整。其中有针对oracle自己jvm和sun jvm的配置,我使用的是sum的jvm所以只修改了“:sun”下面的MEM_ARGS。解释一下参数含义:

  -Xms:内存初始值 
  -Xmx:内存最大值(不要超过内存的80%)
  -XX:MaxPermSize:PermGen(用于存放Class和Meta的信息)区域内存最大值。

运行一段时间发现还是报错,查看了启动命令,发现 %MW_HOME%\user_projects\domains\mydomain\bin\setDomainEnv.cmd 在调用完 wlserver\common\bin\commEnv.cmd 后有这么一句:set MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=128m,将其修改成256m。
<think>我们正在解决WebLogic中出现的Java内存溢出错误(java.lang.OutOfMemoryError: Java heap space)。根据引用[2]和引用[3]的信息,我们可以通过调整WebLogic的JVM内存参数来解决这个问题。具体步骤如下: ### 解决方案:调整WebLogic的JVM堆内存设置 #### 步骤1:定位配置文件 根据引用[2],WebLogic的JVM内存参数通常在`commEnv.cmd`(Windows)或`commEnv.sh`(Linux/Unix)中设置。该文件位于WebLogic安装目录下的`wlserver\common\bin`(Windows)或`wlserver/common/bin`(Linux/Unix)目录。 #### 步骤2:修改内存参数 1. 打开`commEnv.cmd`(或`commEnv.sh`)文件。 2. 找到设置JVM内存参数的代码段。在引用[2]中,该参数名为`MEM_ARGS`;在引用[3]中,还提到了`USER_MEM_ARGS`。我们需要同时修改这两个参数,以确保设置生效。 3. 修改堆内存大小(Heap Size)参数: - `-Xms`:设置JVM初始堆内存大小 - `-Xmx`:设置JVM最大堆内存大小 例如,将设置修改为: ```bash set MEM_ARGS=-Xms1024m -Xmx2048m set USER_MEM_ARGS=-Xms1024m -Xmx2048m ``` 注意:根据引用[3]的例子,也可以同时设置永久代(PermGen)的大小(`-XX:MaxPermSize`),但注意Java 8及以后版本已经移除了永久代,取而代之的是元空间(Metaspace)。因此,如果使用的是Java 8及以上版本,则无需设置`-XX:MaxPermSize`,而应该考虑调整`-XX:MaxMetaspaceSize`。 4. 保存文件。 #### 步骤3:重启WebLogic服务器 修改配置后,需要重启WebLogic服务器使设置生效。 ### 其他建议 1. **监控内存使用**:使用JVM监控工具(如VisualVM、JConsole)监控堆内存使用情况,确保设置的内存大小足够,并观察是否有内存泄漏。 2. **调整垃圾回收**:如果频繁发生内存溢出,可以尝试调整垃圾回收策略。例如,添加以下参数: ```bash -XX:+UseG1GC -XX:MaxGCPauseMillis=200 ``` 3. **分析内存泄漏**:如果调整内存后问题仍然存在,可能应用程序存在内存泄漏。可以使用内存分析工具(如Eclipse MAT)分析堆转储(Heap Dump)文件。 ### 注意事项 - 设置的内存大小不能超过服务器可用物理内存。通常建议设置`-Xms`和`-Xmx`为相同值,以避免堆内存动态调整带来的性能开销。 - 如果是集群环境,需要修改所有受管服务器(Managed Server)的启动参数。 ### 相关问题 1. 如何生成堆转储文件以分析内存泄漏? 2. WebLogic中如何设置元空间(Metaspace)大小? 3. 如何监控WebLogic服务器的内存使用情况? 4. Java 8及以上版本,如何调整元空间大小? 5. WebLogic启动参数设置无效怎么办? > 以上解决方案基于引用[2]和引用[3]提供的信息,并结合了Java内存管理的通用实践。请根据实际环境调整参数值。</think>以下是解决 WebLogic 中 `java.lang.OutOfMemoryError: Java heap space` 错误的完整方案,按照操作步骤排序: ### 解决方案步骤 #### 步骤1:修改 JVM 堆内存参数 1. 定位配置文件: ```bash cd $WL_HOME/server/bin # WebLogic 安装目录 ``` 2. 编辑启动脚本: ```bash vi setDomainEnv.sh # Linux/Unix 或 编辑 setDomainEnv.cmd # Windows ``` 3. 增加堆内存参数(示例): ```bash USER_MEM_ARGS="-Xms1024m -Xmx4096m -XX:MaxPermSize=1024m" export USER_MEM_ARGS ``` 参数说明: - `-Xms1024m`:初始堆大小 (1GB) - `-Xmx4096m`:最大堆大小 (4GB) - `-XX:MaxPermSize=1024m`:永久代大小 (仅 Java 7 及以下需要) 4. **Java 8+ 用户**:替换永久代参数为元空间设置: ```bash USER_MEM_ARGS="-Xms1024m -Xmx4096m -XX:MaxMetaspaceSize=1024m" ``` #### 步骤2:配置服务器启动参数(可选) 在 WebLogic 控制台配置: 1. 访问 `http://<host>:<port>/console` 2. 进入 `环境 > 服务器 > [服务器实例] > 配置 > 服务器启动` 3. 添加参数: ``` -Xms1024m -Xmx4096m -XX:MaxMetaspaceSize=1024m ``` #### 步骤3:生成堆转储分析内存泄漏 1. 发生 OOM 时自动生成堆转储: ```bash USER_MEM_ARGS="-Xms1024m -Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps" ``` 2. 使用分析工具检查内存泄漏: - Eclipse MAT (Memory Analyzer Tool) - VisualVM - YourKit Java Profiler #### 步骤4:优化应用和部署 1. 避免重复部署相同应用(引用[1]) 2. 定期清理临时文件: ```bash rm -rf $DOMAIN_HOME/servers/<server_name>/tmp/* ``` 3. 检查应用内存泄漏: - 审查静态集合类使用 - 检查未关闭的资源(数据库连接、文件流等) - 分析线程局部变量 ### 配置示例对比 | 参数 | 默认值 (示例) | 推荐值 | 作用说明 | |---------------------|-------------------|-------------------|----------------------------| | `-Xms` | `-Xms256m` | `-Xms1024m` | 初始堆内存大小 | | `-Xmx` | `-Xmx512m` | `-Xmx4096m` | 最大堆内存大小 | | `-XX:MaxPermSize` | `-XX:MaxPermSize=128m` | `-XX:MaxPermSize=1024m` | 永久代大小 (Java 7-) | | `-XX:MaxMetaspaceSize` | 未设置 | `-XX:MaxMetaspaceSize=1024m` | 元空间大小 (Java 8+) | | `-XX:+HeapDumpOnOutOfMemoryError` | 未设置 | 建议添加 | OOM时自动生成堆转储 | ### 验证步骤 1. 重启 WebLogic 服务器 2. 检查启动日志确认参数生效: ```bash grep "JVM memory args" $DOMAIN_HOME/servers/<server_name>/logs/<server_name>.log ``` 3. 监控内存使用: ```bash jstat -gc <pid> 1000 # 每1秒输出GC统计 ``` ### 相关问题 1. 如何区分 Java内存溢出和元空间溢出? 2. WebLogic 生产环境推荐的最佳 JVM 参数配置是什么? 3. 如何分析生成的堆转储文件(.hprof)? 4. Java 8 的元空间和永久代有什么区别?[^1][^3] 5. WebLogic 部署时如何避免内存泄漏?[^1] > 配置调整后,建议使用压力测试工具验证稳定性。参数值需根据服务器物理内存调整,通常`-Xmx`不超过物理内存的75%。对于32位JVM,最大堆内存不能超过2GB。 [^1]: 避免重复部署相同应用可减少内存碎片 [^2]:内存参数需根据物理内存比例调整 [^3]: Java 8+ 需用`MaxMetaspaceSize`替代`MaxPermSize`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值