eclipse内存溢出报错:java.lang.OutOfMemoryError:Java heap space.

本文介绍了如何在Eclipse中查看和调整内存配置的方法。通过修改eclipse.ini文件或使用Preferences界面,可以设置JVM的最小和最大内存分配,确保Eclipse运行更流畅。

转载http://blog.sina.com.cn/s/blog_5bd6b451010197vh.html



1查看内存:

workspace/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs,在里面加上SHOW_MEMORY_MONITOR=true,重启eclipse,就可以在其左下角看到内存使用情况。

2 修改内存:

方法一:

找到eclipse/eclipse.ini,打开,在其上加上

-vmargs
-Xms128m
-Xmx512m
-XX:permSize=64M
-XX:MaxPermSize=128M

方法二:

打开eclipse,选择Window--Preferences--Java--InstalledJREs,在右边选择前面有对勾的JRE,单击Edit,出现一个EditJRE的对话框,在其中的Default VMArguments框中输入-Xms128m -Xmx512m。

这样设置java虚拟机内存使用最小是128M,最大是512M。

`java.lang.OutOfMemoryError: Java heap space` 是 Spring Boot 项目运行过程中常见的内存溢出错误,表示 **JVM 堆内存不足**,无法分配更多对象。当你的 Spring Boot 项目“跑一会儿就自己挂掉”,这通常是由于内存泄漏、大对象加载或堆空间设置过小导致的。 --- ## ✅ 一、快速解决方案(应急) 你可以先通过增加 JVM 堆内存来临时解决问题: ```bash # 启动时指定最大堆为 2GB(可根据机器调整) java -Xms512m -Xmx2g -jar your-springboot-app.jar ``` - `-Xms512m`:初始堆大小 - `-Xmx2g`:最大堆大小(建议不超过物理内存的 1/2 ~ 2/3) > ⚠️ 这只是“治标”。如果存在内存泄漏,即使设到 4G 最终还是会 OOM。 --- ## ✅ 二、系统性排查与处理流程 ### 步骤 1:启用 GC 日志(定位问题) 在启动命令中添加 GC 日志输出: ```bash java \ -Xms512m \ -Xmx2g \ -XX:+UseG1GC \ -XX:+PrintGCDetails \ -XX:+PrintGCDateStamps \ -Xloggc:./gc.log \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=./heap-dump.hprof \ -jar your-springboot-app.jar ``` #### 参数说明: | 参数 | 作用 | |------|------| | `-XX:+PrintGCDetails` | 输出详细 GC 信息 | | `-Xloggc:./gc.log` | 将 GC 日志写入文件 | | `-XX:+HeapDumpOnOutOfMemoryError` | OOM 时自动生成堆转储快照 | | `-XX:HeapDumpPath=...` | 指定 dump 文件路径 | --- ### 步骤 2:分析 `gc.log` 判断是否频繁 Full GC 打开生成的 `gc.log`,观察是否有以下现象: ```log [Full GC (Ergonomics) [PSYoungGen: ...] [ParOldGen: 1980MB->1980MB] ...] ``` - 如果 **老年代(Old Gen)使用量持续增长且不释放** → 存在内存泄漏 - 如果每次 Full GC 后内存只降一点点 → 可能有大对象未释放 --- ### 步骤 3:分析 Heap Dump(关键步骤) 当发生 OOM 时,会生成一个 `.hprof` 文件(如 `heap-dump.hprof`),用工具分析它。 #### 工具推荐: - **[Eclipse MAT (Memory Analyzer)](https://www.eclipse.org/mat/)**(最常用) - **VisualVM** - **JProfiler** ##### 使用 Eclipse MAT 分析步骤: 1. 下载并安装 Eclipse MAT 2. 打开 → File → Open Heap Dump → 选择 `heap-dump.hprof` 3. 查看 **"Leak Suspects Report"**(MAT 会自动提示可能的内存泄漏) 4. 查找最大的对象(Dominator Tree) 5. 查看谁持有了这些对象的引用(防止被回收) 常见问题包括: - 静态集合类(如 `static Map`, `List`)不断添加元素 - 缓存未设置过期策略 - 流未关闭(InputStream / ResultSet 等) - 第三方库不当使用(如未注销监听器) --- ### 步骤 4:代码层面检查常见内存泄漏点 #### 🔍 常见原因及修复方式: | 问题 | 示例代码 | 修复方法 | |------|--------|---------| | **静态集合累积数据** | `public static List<String> cache = new ArrayList<>();` | 改用弱引用或限制大小 + 定期清理 | | **未关闭资源** | `InputStream is = new FileInputStream("huge.zip");`(没 close) | 使用 try-with-resources | | **无限缓存** | `Map<String, Object> cache = new HashMap<>();` | 使用 `Caffeine`, `Ehcache` 并设置最大容量和 TTL | | **大文件上传/下载处理不当** | 一次性读取整个文件到内存 | 改为流式处理 | | **日志打印大对象** | `log.info("data={}", hugeObject);` | 避免打印大型 JSON 或 Entity | ✅ 示例:安全读取大文件 ```java try (BufferedReader reader = Files.newBufferedReader(Paths.get("big-file.txt"))) { String line; while ((line = reader.readLine()) != null) { // 处理每行 } } // 自动关闭 ``` ✅ 示例:使用 Caffeine 缓存(防内存爆炸) ```xml <!-- pom.xml --> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency> ``` ```java @Autowired private Cache<String, Object> cache; @PostConstruct public void init() { cache = Caffeine.newBuilder() .maximumSize(1000) // 最多 1000 条 .expireAfterWrite(Duration.ofMinutes(10)) .build(); } ``` --- ### 步骤 5:监控运行时内存(预防) #### 方式一:使用 Spring Boot Actuator + Prometheus/Grafana ```xml <!-- pom.xml --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` ```yaml # application.yml management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always ``` 访问 `http://localhost:8080/actuator/metrics/jvm.memory.max` 和 `used` 查看内存趋势。 #### 方式二:使用 JConsole / VisualVM 实时监控 ```bash jconsole # 或 jvisualvm ``` 连接到你的 Spring Boot 进程,查看堆内存曲线、线程、类加载情况。 --- ## ✅ 三、优化 JVM 参数(生产建议) ```bash java \ -Xms1g \ -Xmx1g \ -XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 \ -XX:+ScavengeAlwaysTenured \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=/opt/logs/heap-dump.hprof \ -XX:+PrintGCDetails \ -Xloggc:/opt/logs/gc.log \ -jar app.jar ``` > 生产环境建议固定 Xms 和 Xmx 相同值,避免动态扩容影响性能。 --- ## ✅ 四、总结处理流程图 ``` OOM 发生 ↓ 启用 HeapDump + GC 日志 ↓ 分析 gc.log → 是否频繁 Full GC? ↓ 分析 heap-dump.hprof(MAT) ↓ 定位大对象 / 泄漏根源 ↓ 修复代码(缓存、静态变量、资源释放) ↓ 上线后持续监控(Actuator / Prometheus) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值