Root cause of ServletException java.lang.OutOfMemoryError解决方法

博客主要讲述下载电子报表时,报表过大引发 java.lang.OutOfMemoryError 问题,且该问题已解决。解决方法是调整 bea/weblogic/common 中 CommEnv 参数,设置 JAVA_VM、MEM_ARGS 等,还对 MaxPermSize 相关原理进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:下载电子报表,当电子报表过大发生"Root cause of
ServletException  java.lang.OutOfMemoryError"
  问题状态:已解决
  解决方法:调整bea/weblogic/common中CommEnv中参数
       :sun
if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode
set JAVA_VM=-client
set MEM_ARGS=-Xms256m -Xmx512m -XX:MaxPermSize=256m
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto continue
:sun_prod_mode
set JAVA_VM=-server
set MEM_ARGS=-Xms256m -Xmx512m -XX:MaxPermSize=256m
goto continue

即解决此问题

reference:

MaxPermSize:
The permanent space is memory allocated outside the regular
heap (i.e. in addition to the -Xmx setting), so it is important
 to ensure there is enough physical RAM on the machine.
The permanent space is used to primarily store classes and
objects created for reflection support (methods etc.). If
you have a large number of classes in a Java application,
an OOM can occur if the PermSize is too small.

From one of your previous posts, you seem to have 8 applications,
 so yes, setting the PermSize and/or MaxPermSize could help.
Also, 256MB sounds small for a server with 8 applications.
The OOM could simply indicate that your heap is too small.
Hope this helps,
Arunabh

### Jakarta Servlet 中 Java 堆内存不足导致 OutOfMemoryError解决方案 当遇到 `jakarta.servlet.ServletException` 和 `java.lang.OutOfMemoryError: Java heap space` 错误时,通常表明应用程序的 JVM 堆空间不足以支持当前的操作。以下是详细的解决方法: #### 1. **调整 JVM 堆内存参数** 通过修改 JVM 启动参数来增加堆内存大小是最常见的解决方式之一。可以尝试以下配置: ```bash -Xms512M -Xmx1024M -XX:NewRatio=3 -XX:PermSize=256M -XX:MaxPermSize=512M -XX:-UseGCOverheadLimit ``` 其中: - `-Xms512M`: 设置初始堆内存大小为 512 MB。 - `-Xmx1024M`: 设置最大堆内存大小为 1 GB。 - `-XX:NewRatio=3`: 新生代与老年代的比例设为 1:3。 - `-XX:PermSize=256M`: 设置永久代初始大小为 256 MB。 - `-XX:MaxPermSize=512M`: 设置永久代最大大小为 512 MB。 - `-XX:-UseGCOverheadLimit`: 关闭垃圾回收开销限制。 这些参数可以根据实际需求进一步优化[^5]。 #### 2. **优化代码逻辑减少内存占用** 除了调整 JVM 参数外,还需要审查代码是否存在可能导致内存泄漏或过度消耗的情况。例如: - 检查是否有大对象未及时释放。 - 避免加载过大的数据集到内存中。 - 使用流式处理替代一次性加载大量数据。 #### 3. **Tomcat 特定配置** 如果应用部署在 Tomcat 上,则需要确保 Tomcat 的启动脚本也包含了足够的内存分配。对于 Windows 平台,编辑 `%TOMCAT_HOME%\bin\catalina.bat` 文件;对于 Linux 平台,编辑 `$TOMCAT_HOME/bin/catalina.sh` 文件,添加如下内容: ```bash set JAVA_OPTS=%JAVA_OPTS% -Xms512M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=512M ``` 或者,在 Eclipse 或其他 IDE 中打开项目的 Launch Configuration,在 Arguments 标签下加入相同的 JVM 参数[^4]。 #### 4. **监控和诊断工具的应用** 为了更好地定位问题的根本原因,可以借助一些性能监测工具,如 JVisualVM、JProfiler 或 YourKit 等。它们可以帮助识别哪些部分占用了过多的内存以及是否存在潜在的内存泄露风险。 --- ### 示例代码片段 假设有一个场景涉及读取并存储大量的文件内容至内存中,可以通过分批处理的方式降低单次操作所需的内存量: ```java import java.io.BufferedReader; import java.io.FileReader; public class LargeFileProcessor { public static void processLargeFile(String filePath) throws Exception { try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; while ((line = br.readLine()) != null) { // 对每一行单独处理而不是全部加载进内存 handleLine(line); } } } private static void handleLine(String line) { System.out.println("Processing Line: " + line.substring(0, Math.min(line.length(), 50))); } } ``` 以上示例展示了如何逐行读取大型文件而非将其整体加载入内存,从而有效节省资源[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值