Matlab 报错 Error java.lang.OutOfMemoryError: GC overhead limit exceeded 解决

在运行《Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields》代码时遇到Error java.lang.OutOfMemoryError: GC overhead limit exceeded的报错。该问题并非由于CPU或GPU内存不足,而是Matlab为Java堆分配的内存不足。解决方法是调整Matlab的Java堆大小设置。

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

在跑《Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields》这篇论文的evaluation代码https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation时报错。

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at com.android.dx.dex.code.OutputFinisher.findExpandedOpcodeForInsn(OutputFinisher.java:525)
    at com.android.dx.dex.code.OutputFinisher.calculateReservedCount(OutputFinisher.java:466)
    at com.android.dx.dex.code.OutputFinisher.reserveRegisters(OutputFinisher.java:402)
    at com.android.dx.dex.code.OutputFinisher.finishProcessingAndGetList(OutputFinisher.java:358)
    at com.android.dx.dex.code.DalvCode.finishProcessingIfNecessary(DalvCode.java:108)
    at com.android.dx.dex.code.DalvCode.getInsns(DalvCode.java:185)
   
### Matlab解决 `java.lang.OutOfMemoryError: GC overhead limit exceeded` 错误 在 Matlab 调用 Java 程序时,可能会遇到 `java.lang.OutOfMemoryError: GC overhead limit exceeded` 错误。这通常表明垃圾回收器花费了过多时间(超过 98% 的 CPU 时间)来尝试回收内存,但回收的内存比例却非常低(小于 2%)。以下是一些解决方案: #### 1. 修改 JVM 参数以增加堆内存 可以通过调整 Matlab 启动时的 JVM 参数来增大堆内存大小。具体方法如下: - 创建或编辑文件 `matlab.prf`,该文件通常位于用户主目录下的 `.matlab/R20XXx/` 文件夹中(R20XXx 是 Matlab 的版本号)。 - 在文件中添加以下内容: ```plaintext JavaMemHeapMax=4g ``` 这将设置最大堆内存为 4GB。可以根据实际需求调整值,例如 `8g` 或 `16g`。 此更改需要重启 Matlab 才能生效[^1]。 #### 2. 禁用 `UseGCOverheadLimit` 特性 JDK 1.6 和 JDK 1.7 默认启用了 `-XX:+UseGCOverheadLimit` 参数。此参数会在垃圾回收占用过多时间且回收内存较少时抛出 `OutOfMemoryError` 异常。可以通过禁用此特性来避免此类错误: - 编辑 `matlab.prf` 文件,添加以下内容: ```plaintext JvmOptions=-XX:-UseGCOverheadLimit ``` 这样可以关闭 `UseGCOverheadLimit` 特性,允许程序继续运行即使垃圾回收效率较低[^3]。 #### 3. 调整垃圾回收器类型 某些情况下,默认的垃圾回收器可能不适合特定任务。可以尝试切换到其他垃圾回收器,例如 G1 垃圾回收器: - 在 `matlab.prf` 文件中添加以下内容: ```plaintext JvmOptions=-XX:+UseG1GC ``` G1 垃圾回收器旨在减少长时间的停顿,并适合大内存环境下的应用。 #### 4. 检查 MatlabJava 的兼容性 确保 Matlab 使用的 JDK 版本与系统兼容。如果使用的是较旧版本的 Matlab 或 JDK,可能会导致兼容性问题。建议升级到最新版本的 Matlab 和 JDK[^4]。 #### 5. 优化代码以减少内存消耗 检查 MatlabJava 代码,寻找可能导致内存泄漏或高内存消耗的部分。例如: - 避免创建过多的大对象。 - 及时释放不再使用的对象。 - 减少循环中的临时变量分配。 #### 示例代码:设置 JVM 参数 以下是一个示例脚本,用于动态修改 Matlab 的 JVM 参数: ```matlab function setJavaVMOptions() % 设置 JVM 参数 options = '-Xmx4g -XX:-UseGCOverheadLimit'; java.lang.System.setProperty('sun.java.command', ['matlab ' options]); end ``` 调用此函数后,重新启动 Matlab 以使更改生效。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值