android7.1 OOM问题出现Try increasing heap size with java option '-Xmx'报错信息

本文解决Android项目编译时遇到的内存溢出错误,通过调整JACK服务的堆大小参数-Xmx,成功解决了编译失败的问题。

编译中出现报错:

报错原信息:

[  2% 815/30212] Building with Jack: target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex
FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)).
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx<size>'.
Warning: This may have produced partial or corrupted output.
[  2% 815/30212] Building with Jack: out/target/common/obj/JAVA_LIBRARIES/mp4parser_intermediates/classes.jack
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1

原因是因为电脑内存不足的问题
 

解决方法:

从上面的错误信息中我们可以看到

Try increasing heap size with java option '-Xmx<size>'.   

我们对Android_Src/prebuilts/sdk/tools/jack-admin文件进行如下修改:

JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"

改为

JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"

添加-Xmx4096m参数

改完之后进入源码根目录依次执行下面两条语句重启服务jack-admin服务

./prebuilts/sdk/tools/jack-admin stop-server          关闭服务

./prebuilts/sdk/tools/jack-admin start-server          打开服务

重启完jack-admin服务后,此时再重新执行编译就可以通过了。

 

 

<think>好的,我现在需要帮助用户解决在Windows下设置JVM参数-Xms8g和-Xmx8g后仍然出现OOM问题。首先,我需要回顾用户之前提供的引用内容,特别是引用3和引用4,因为它们讨论了OOM和堆内存配置的关系。 用户的问题是在配置了8G的堆内存后仍然遇到OOM,这可能涉及几个方面。首先,OOM可能不仅仅是因为堆内存不足,还可能存在内存泄漏或者堆外内存的使用问题。根据引用3,堆内存设置过大反而可能减少其他内存区域的空间,比如虚拟机栈,从而影响线程数量,但这里用户的问题是关于OOM,所以更可能是堆内存本身的问题。 接下来,我需要考虑可能的根本原因。根据引用3,如果堆内存设置过大,可能导致其他区域(如方法区、本地方法栈)的内存不足,但这里用户设置的是8G,假设物理内存足够的话,这可能不是主因。但引用3也提到,高并发情况下,如果堆内存设置过大,可能反而导致线程数量减少,不过OOM主要与堆有关,所以需要重点检查堆的使用情况。 引用4提到可以通过生成HeapDump来分析OOM原因,用户可能在配置参数时已经添加了HeapDump参数,但可能需要进一步分析dump文件。此外,用户可能需要检查是否有内存泄漏,比如未释放的对象或缓存过度使用。 另外,需要考虑堆外内存的使用,比如直接内存(Direct Memory)或JNI调用,这些不受-Xmx参数限制。例如,使用NIO的ByteBuffer会占用直接内存,而直接内存的大小由-XX:MaxDirectMemorySize控制,如果未设置,可能与堆内存设置相关,但默认情况下可能足够。 还有可能的是,应用程序本身需要的内存超过了8G,比如加载大量数据或处理大文件,这时候即使堆设置为8G也可能不够,需要调整参数或优化代码。 解决方案方面,首先建议用户生成并分析HeapDump,使用工具如Eclipse MAT或VisualVM来查看内存中的对象。其次,检查是否有内存泄漏,优化代码,减少不必要的对象持有。然后,调整其他内存参数,比如元空间(Metaspace)的大小,使用-XX:MaxMetaspaceSize,因为Metaspace默认不受-Xmx限制。此外,检查堆外内存的使用,适当调整直接内存大小。 还需要考虑JVM的垃圾回收机制,如果存在频繁的GC导致应用暂停,可能需要调整垃圾回收器或相关参数,比如使用G1GC来提高效率。同时,确保物理内存足够,避免系统级别的内存不足。 总结起来,用户的问题可能涉及堆内存不足、内存泄漏、堆外内存使用、元空间不足等多个方面,需要系统性地排查和调整参数,结合工具分析具体情况。</think>### 在 Windows 下设置 `-Xms8g -Xmx8g` 仍出现 OOM 的原因及解决方案 --- #### 一、**根本原因分析** 即使设置了 `-Xms8g -Xmx8g`,仍出现 OOM 的常见原因如下: 1. **堆内存实际需求超出 8GB** - **对象驻留**:应用程序可能创建了大量长期存活的对象(如缓存、静态集合),导致堆内存逐渐耗尽[^3] - **内存泄漏**:未正确释放资源(如未关闭数据库连接、未清理集合引用),导致对象无法被垃圾回收(GC)[^4] - **大文件/数据加载**:一次性加载超大文件(如 CSV、JSON)到内存中,直接超出堆容量限制 2. **堆外内存溢出** - **直接内存(Direct Memory)**:使用 `ByteBuffer.allocateDirect()` 或 NIO 操作时,分配的直接内存不受 `-Xmx` 限制,需通过 `-XX:MaxDirectMemorySize` 单独设置[^3] - **本地方法调用(JNI)**:通过 JNI 调用的本地库可能分配大量非堆内存 3. **元空间(Metaspace)或方法区溢出** - **动态类加载**:框架(如 Spring、Hibernate)动态生成类可能撑满元空间 - **默认限制**:元空间默认无上限(依赖系统内存),需通过 `-XX:MaxMetaspaceSize` 限制 4. **线程栈溢出(StackOverflowError)** -OOM 不同,但需注意 `-Xss` 参数设置不当可能导致线程数受限,间接影响堆内存分配 --- #### 二、**诊断步骤** 1. **生成并分析 Heap Dump** - 启动时添加参数: ```cmd -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\dump ``` - 使用工具(如 **Eclipse MAT** 或 **VisualVM**)分析 Dump 文件,定位内存占用最高的对象[^4] 2. **监控内存使用** - 使用 `jconsole` 或 `jstat -gc <pid>` 实时观察堆内存分布: ```text S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 8192.0 8192.0 0.0 0.0 65536.0 65536.0 81920.0 81920.0 4864.0 4608.0 512.0 448.0 1 0.015 2 0.030 0.045 ``` - 关注 `OU`(老年代使用量)和 `EU`(年轻代使用量)是否持续增长 3. **检查堆外内存** - 通过 `Native Memory Tracking` 追踪: ```cmd -XX:NativeMemoryTracking=detail ``` - 使用 `jcmd <pid> VM.native_memory detail` 查看非堆内存分配 --- #### 三、**解决方案** 1. **优化堆内存使用** - **限制缓存大小**:使用 WeakHashMap 或 Guava Cache 的软引用策略 - **分批次处理数据**:避免一次性加载大文件,改为流式处理 - **修复内存泄漏**:通过 Dump 文件定位代码中的无效对象引用 2. **调整 JVM 参数** - **增加元空间限制**: ```cmd -XX:MaxMetaspaceSize=512m ``` - **限制直接内存**: ```cmd -XX:MaxDirectMemorySize=2g ``` - **优化 GC 策略**(如启用 G1 垃圾回收器):
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值