`

【转载】关于android编译出现“GC overhead limit exceeded”的解决办法。

 
阅读更多

用了下面找到的这个办法,不过貌似没有彻底解决我的问题,仍然在某处jack build的时候会出现java GC溢出的问题。根据错误的提示,在android目录下寻找关键字-Xmx3500 (默认,但是会溢出的GC heap大小),找到如下几个文件分别进行修改。

  • build/core/config.mk:
    • JILL :=java -Xmx3500m -jar $(JILL_JAR)
    • APICHECK_COMMAND := $(APICHECK) -JXmx1024m -J"classpath $(APICHECK_CLASSPATH)"
  • external/guava/guava-gwt/pom.xml: <extraJvmArgs>-Xms3500m -Xmx3500m -Xss1024k</extraJvmArgs>

从log看,应该是修改第一行JILL这里就好了,不过为了省心,干脆所有Xmx的地方一起改掉成6144m。

 

================更新线===================

 

玛德在一台10G内存的机器上无限次碰到jack编译时候GC溢出的问题,搜了一下,找到一个靠谱的解决方案。

转自: http://blog.csdn.net/brightming/article/details/49763515

 

================转载的分割线=================

参考:

 

https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/

 

 

 

1、下载

 

参考了以下的下载失败重下载脚本:

 

[zzz@localhost android-src]$ cat myrepo.sh 
#!/bin/sh
repo sync
while [ $? -ne 0 ] 
do 
    echo "try repo sync again"
    repo sync
done
[zzz@localhost android-src]$ 

 

 

 

下班前开始跑,第二天就有了。

 

 

 

2、编译第一次直接进入下载的源代码目录,运行make,过了3个多小时后,报错:

 

[ 31% 9980/31772] host Java: bouncycastle-host (out/host/common/obj/JAVA_LIBRARIES/bouncycastle-host_intermediates/classes)
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[ 31% 9983/31772] host Java: bouncycastle-bcpkix-host (out/host/common/obj/JAVA_LIBRARIES/bouncycastle-bcpkix-host_intermediates/classes)
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[ 31% 9987/31772] Build: out/host/linux-x86/obj/EXECUTABLES/jack_intermediates/jack
Writing client settings in /home/gumh/.jack-settings
Installing jack server in "/home/gumh/.jack-server"
Launching Jack server java -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /home/gumh/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher
[ 31% 10007/31772] host C++: zipalign <= build/tools/zipalign/ZipEntry.cpp
build/tools/zipalign/ZipEntry.cpp:145:52: warning: unused parameter 'pZipFile' [-Wunused-parameter]
status_t ZipEntry::initFromExternal(const ZipFile* pZipFile,
                                                   ^
build/tools/zipalign/ZipEntry.cpp:151:12: warning: destination for this 'memcpy' call is a pointer to dynamic class 'CentralDirEntry'; vtable pointer will be overwritten [-Wdynamic-class-memaccess]
    memcpy(&mCDE, &pEntry->mCDE, sizeof(mCDE));
    ~~~~~~ ^
build/tools/zipalign/ZipEntry.cpp:151:12: note: explicitly cast the pointer to silence this warning
    memcpy(&mCDE, &pEntry->mCDE, sizeof(mCDE));
           ^
           (void*)
2 warnings generated.
[ 31% 10012/31772] host C: libzopfli <= external/zopfli/src/zopfli/lz77.c
external/zopfli/src/zopfli/lz77.c:95:60: warning: unused parameter 'datasize' [-Wunused-parameter]
void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
                                                           ^
1 warning generated.
[ 31% 10040/31772] Building with Jack: out/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
GC overhead limit exceeded
Try increasing heap size with java option '-Xmx<size>'
Warning: This may have produced partial or corrupted output.
ninja: build stopped: subcommand failed.

make: *** [ninja_wrapper] Error 1
[zzz@localhost android-src]$ 

 

 

 

 

 

//---2015-11-13--//

 

 

 

make之前还运行了下面的指令:

 

#source ./build/envsetup.sh

 

这个命令选择你的编译环境的硬件体系

 

#lunch

 

下面这个命令就开始编译了

 

#make

 

通过跟踪顶层makefile,找到有关jack的目录:prebuilts/sdk/tools,其中看到有个jack-admin,正是启动jack所在的shell。里面有个设置:

 

#
# Settings
#
JACK_HOME="${JACK_HOME:=$HOME/.jack-server}"
CLIENT_SETTING="${CLIENT_SETTING:=$HOME/.jack-settings}"
TMPDIR=${TMPDIR:=/tmp}
JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation}"

 

 

 

修改一下,增加-Xmx2048M:

 

#
# Settings
#
JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx:2048M}"

 

再次make,好像没起作用:

 

[  1% 296/20841] Build: out/host/linux...bj/EXECUTABLES/jack_intermediates/jack
Jack server already installed in "/home/gumh/.jack-server"
Launching Jack server java -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /home/gumh/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher

 

 

 

找到jack-admin中的start-server语句,直接在里面增加:

 

 start-server)
    isServerRunning
    RUNNING=$?
    if [ "$RUNNING" = 0 ]; then
      echo "Server is already running"
    else
      echo "before to start-server,JACK_SERVER_VM_ARGUMENTS=" $JACK_SERVER_VM_ARGUMENTS
      JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS
-Xmx2048M -cp $LAUNCHER_JAR $LAUNCHER_NAME"
      echo "Launching Jack server" $JACK_SERVER_COMMAND
      (

 

 

 

再次执行make指令,这次ok了。

 

这里有一个问题没弄清楚:有时候执行make的时候,会自动启动jackserver,有时候又不会,会报错说server未启动,请用jack-admin start-server来启动的提示。

 

 

 

经过了4个多小时,终于完成了。

 

external/gtest/include/gtest/gtest_pred_impl.h:77:52: note: expanded from macro 'GTEST_ASSERT_'
  if (const ::testing::AssertionResult gtest_ar = (expression)) \
                                                   ^
1 warning generated.
[100% 20544/20544] host Executable: ne...t_test_osi_intermediates/net_test_osi)

 

查看一下:

 

[zzz@localhost android-src]$ ll out/target/product/generic/
total 1594800
-rw-rw-r--.  1 zzz zzz          7 Nov 14 11:27 android-info.txt
-rw-rw-r--.  1 zzz zzz         63 Nov 14 11:25 build_fingerprint.txt
drwxrwxr-x.  2 zzz zzz       4096 Nov 14 14:37 cache
-rw-r--r--.  1 zzz zzz   69206016 Nov 14 14:37 cache.img
-rw-rw-r--.  1 zzz zzz      72964 Nov 10 15:40 clean_steps.mk
drwxrwxr-x.  4 zzz zzz       4096 Nov 14 11:27 data
drwxrwxr-x.  3 zzz zzz       4096 Nov 14 12:02 dex_bootjars
drwxrwxr-x.  5 zzz zzz       4096 Nov 14 13:58 gen
-rw-rw-r--.  1 zzz zzz      72739 Nov 14 14:37 installed-files.txt
drwxrwxr-x. 12 zzz zzz       4096 Nov 14 14:36 obj
-rw-rw-r--.  1 zzz zzz        788 Nov 14 11:25 previous_build_config.mk
-rw-rw-r--.  1 zzz zzz    1244829 Nov 14 14:37 ramdisk.img
drwxrwxr-x.  3 zzz zzz       4096 Nov 14 11:27 recovery
drwxrwxr-x. 15 zzz zzz       4096 Nov 14 11:28 root
drwxrwxr-x.  6 zzz zzz       4096 Nov 10 17:57 symbols
drwxrwxr-x. 14 zzz zzz       4096 Nov 14 14:36 system
-rw-r--r--.  1 zzz zzz 1610612736 Nov 14 14:37 system.img
-rw-r--r--.  1 zzz zzz  576716800 Nov 14 14:37 userdata.img
[zzz@localhost android-src]$ 

 

 

这些应该如何测试呢?下面再补。

分享到:
评论

相关推荐

    poi大量数据读取gc内存溢出解决方案

    poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...

    Eclipse下使用ANT编译提示OutOfMemory的解决方法

    在使用Eclipse集成开发环境(IDE)进行ANT编译时,有时会遇到“OutOfMemory”错误,这通常意味着ANT在尝试编译大量代码或者运行复杂构建任务时,分配给它的内存不足。为了解决这个问题,我们需要调整ANT的内存设置,...

    myeclipse 解决内存的问题

    ### MyEclipse解决内存问题详解 #### 一、引言 在使用MyEclipse开发工具的过程中,用户可能会遇到性能下降的问题,比如启动速度变慢、响应时间加长等。这些问题通常与MyEclipse所占用的内存资源有关。本文将详细...

    xmemcached-1.2.6.2

    xmemcached-1.2.6.2

    R语言导入导出数据方法介绍

    讲述如何在R语言中导入导出数据的PPT,一共28张

    hive on spark mr 数据开发常见问题解决

    当Hive作业处理大数据量时,可能会出现`shuffle in fetcher#6 at GC overhead limit exceeded`错误。这通常是因为MapReduce任务的内存分配不当导致的。为解决这个问题,可以调整`mapreduce.reduce.shuffle.input....

    OutOfMemoryError Handbook

    OutOfMemoryError的8种经典案例,Java heap space、GC overhead limit exceeded、Permgen space、Metaspace、Unable to create new native thread、Out of swap space?、Requested array size exceeds VM limit、...

    kettle内存溢出(Java heap space)以及解决方法.docx

    最后,监控系统性能和Kettle日志也是解决问题的关键,它可以帮助我们了解内存使用情况,及时发现并解决问题。同时,理解数据处理的瓶颈,选择合适的硬件配置和软件配置,都是预防和解决Kettle内存溢出问题的重要手段...

    Java堆内存又溢出了!教你一招必杀技(推荐)

    Java内存溢出问题是一个常见的性能瓶颈,特别是在大型的JAVA项目中。...了解并熟练掌握这些知识点,可以帮助我们有效地诊断和解决Java应用程序中的内存溢出问题,优化系统性能,减少不必要的GC停顿,提升用户体验。

    关于java堆内存溢出的几种情况

    【情况二】:`java.lang.OutOfMemoryError: GC overhead limit exceeded` 这个错误是JDK6引入的新类型,当垃圾收集器为了释放少量空间而花费过多时间时抛出。通常由于堆内存过小,导致频繁且效率低下的垃圾回收。...

    高手总结的9种OOM常见原因及解决方案.docx

    高手总结了9种OOM常见原因及解决方案,涵盖Java heap space、GC overhead limit exceeded、Permgen space、Metaspace、Unable to create new native thread等多种情况。 1. Java heap space Java heap space错误...

    SmaliInjector20170719

    若在 jar 转加 dex 的过程中出现 java.lang.OutOfMemoryError: GC overhead limit exceeded 的错误,请调大 main.bat 中的 -Xmx 和 -Xss 其它: ============================================================...

    系统稳定性——OutOfMemoryError常见原因及解决方法1

    当JVM执行垃圾收集的时间超过98%,但只能回收不到2%的内存,并且这种情况连续发生5次,就会触发`java.lang.OutOfMemoryError:GC overhead limit exceeded`。这表明应用几乎耗尽了所有内存,且GC无法有效回收。 - ...

    理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案.docx

    2. OutOfMemoryError: GC overhead limit exceeded:超过 98% 的时间用来做 GC 并且回收了不到 2% 的堆内存。 3. OutOfMemoryError: Direct buffer memory:堆外内存。 4. OutOfMemoryError: unable to create new ...

    OutOfMemoryError_8种典型案例分享

    当垃圾收集器在执行GC时,所花费的时间超过98%的时间用于回收不到2%的堆内存,超过一定的阈值时就会抛出GC overhead limit exceeded错误。这通常表明应用生成了太多的垃圾,虽然堆内存未满,但垃圾太多导致垃圾回收...

    教你分析9种OOM常见原因及解决方案.docx

    2. GC Overhead Limit Exceeded 错误 * 原因分析:应用程序已经基本耗尽了所有可用内存,GC 也无法回收 * 解决方案:检查大对象的合理性、添加机器资源、做限流降级、找到持有的对象、修改代码设计 3. Permgen ...

    sliding-block-puzzle:使用搜索算法解决滑块难题

    有两个证据可以证明这一点: 对于随机生成的15个难题,DFS总是会出现以下错误: java.lang.OutOfMemoryError: GC overhead limit exceeded如果我通过改组最终状态难题来创建15个拼图,那么随着改组次数的增加,DFS...

    FTB-Presents-Stoneblock-2

    如果您的游戏在启动时崩溃,并且崩溃日志中的行类似于Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded或Caused by: java.lang.OutOfMemoryError: Java heap space ,这是因为游戏的RAM不足了。...

    无私奉献-jvm面试备战

    OutOfMemoryError 异常有多种场景,包括 java.lang.OutOfMemoryError: Java heap space、java.lang.OutOfMemoryError: GC overhead limit exceeded 和 java.lang.OutOfMemoryError: Direct buffer memory 等。

    Elasticsearch集群中JVM问题的应对之策

    Elasticsearch集群中JVM问题的应对之策,PDF文档,欢迎下载,11111

Global site tag (gtag.js) - Google Analytics