安卓:一段时间后,本机进程惹ReferenceTable溢出(的Android NDK) [英] Android: Native process provoke ReferenceTable overflow after a while (android-ndk)
问题描述
使用我编了一code用C语言编写的程序是一个ECM格式的文件转换,这里的原生code中的NDK:的链接。 我选择了做用JNI优化的原因,因为该程序需要大量的CPU处理的。
Using the ndk I have compiled a code written in C. The program is a ecm format files conversion, here the native code: link . I chose to do with JNI for reasons of optimization, because the program requires a large amount of CPU processing.
转换可能非常大,200MB和700MB之间的文件。一切完美的作品,但试图转换大于600MB的大文件时,附近的转换过程的结束,并出现以下错误消息的应用程序停止:
The files to convert can be very large, between 200mb and 700mb. Everything works perfectly, but when trying to convert files bigger than 600Mb, near the end of the conversion process, the application stops with the following error message:
11-13 20:24:36.775: WARN/dalvikvm(1468): ReferenceTable overflow (max=512)
11-13 20:24:36.775: WARN/dalvikvm(1468): Last 10 entries in JNI local reference table:
11-13 20:24:36.775: WARN/dalvikvm(1468): 502: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.775: WARN/dalvikvm(1468): 503: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.775: WARN/dalvikvm(1468): 504: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.775: WARN/dalvikvm(1468): 505: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.775: WARN/dalvikvm(1468): 506: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.775: WARN/dalvikvm(1468): 507: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.775: WARN/dalvikvm(1468): 508: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.786: WARN/dalvikvm(1468): 509: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.786: WARN/dalvikvm(1468): 510: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.786: WARN/dalvikvm(1468): 511: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes)
11-13 20:24:36.786: WARN/dalvikvm(1468): JNI local reference table summary (512 entries):
11-13 20:24:36.786: WARN/dalvikvm(1468): 512 of Ljava/lang/Class; 164B (1 unique)
11-13 20:24:36.786: WARN/dalvikvm(1468): Memory held directly by tracked refs is 164 bytes
11-13 20:24:36.786: ERROR/dalvikvm(1468): Failed adding to JNI local ref table (has 512 entries)
11-13 20:24:36.786: INFO/dalvikvm(1468): "Thread-9" prio=5 tid=8 RUNNABLE
11-13 20:24:36.786: INFO/dalvikvm(1468): | group="main" sCount=0 dsCount=0 s=N obj=0x46523c48 self=0x30e960
11-13 20:24:36.786: INFO/dalvikvm(1468): | sysTid=1506 nice=0 sched=0/0 cgrp=default handle=2542616
11-13 20:24:36.786: INFO/dalvikvm(1468): | schedstat=( 200042694099 61087921121 333928 )
11-13 20:24:36.786: INFO/dalvikvm(1468): at unecm4droid.kiio.es.mainUECM.invokeNativeFunction(Native Method)
11-13 20:24:36.786: INFO/dalvikvm(1468): at unecm4droid.kiio.es.mainUECM.access$10(mainUECM.java:490)
11-13 20:24:36.786: INFO/dalvikvm(1468): at unecm4droid.kiio.es.mainUECM$11.run(mainUECM.java:735)
11-13 20:24:36.786: ERROR/dalvikvm(1468): VM aborting
11-13 20:24:36.795: INFO/DEBUG(121): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-13 20:24:36.795: INFO/DEBUG(121): Build fingerprint: 'google/passion/passion/mahimahi:2.2/FRF91/43546:user/release-keys'
11-13 20:24:36.795: INFO/DEBUG(121): pid: 1468, tid: 1506 >>> unecm4droid.kiio.es <<<
11-13 20:24:36.795: INFO/DEBUG(121): signal 11 (SIGSEGV), fault addr deadd00d
11-13 20:24:36.795: INFO/DEBUG(121): r0 00000026 r1 afd14699 r2 afd14699 r3 00000000
11-13 20:24:36.795: INFO/DEBUG(121): r4 802a3448 r5 802a3448 r6 0030e960 r7 0030e9b0
11-13 20:24:36.795: INFO/DEBUG(121): r8 464c9b48 r9 43277fa4 10 43277f8c fp 464c9ed8
11-13 20:24:36.795: INFO/DEBUG(121): ip deadd00d sp 464c9130 lr afd16155 pc 802424e0 cpsr 20000030
11-13 20:24:36.795: INFO/DEBUG(121): d0 643a64696f72646e d1 6472656767756265
11-13 20:24:36.795: INFO/DEBUG(121): d2 465117b046511767 d3 465117b04651170a
11-13 20:24:36.795: INFO/DEBUG(121): d4 465117b0465117b0 d5 465117b0465117b0
11-13 20:24:36.795: INFO/DEBUG(121): d6 465117b0465117b0 d7 465117b0465117b0
11-13 20:24:36.795: INFO/DEBUG(121): d8 4198000041b80000 d9 43e0000000000000
11-13 20:24:36.795: INFO/DEBUG(121): d10 41dfffffffc00000 d11 c3e0000000000000
11-13 20:24:36.795: INFO/DEBUG(121): d12 0000000000000000 d13 0000000000000000
11-13 20:24:36.795: INFO/DEBUG(121): d14 0000000000000000 d15 0000000000000000
11-13 20:24:36.795: INFO/DEBUG(121): d16 47d7202800000000 d17 c083180000000000
11-13 20:24:36.795: INFO/DEBUG(121): d18 4035000000000000 d19 0000000000000000
11-13 20:24:36.795: INFO/DEBUG(121): d20 3ff0000000000000 d21 8000000000000000
11-13 20:24:36.795: INFO/DEBUG(121): d22 c035000000000000 d23 ff00080008000700
11-13 20:24:36.795: INFO/DEBUG(121): d24 ff00080008000700 d25 ff00080008000700
11-13 20:24:36.795: INFO/DEBUG(121): d26 0100010001000100 d27 0100010001000100
11-13 20:24:36.795: INFO/DEBUG(121): d28 0100010001000100 d29 3ff0000000000000
11-13 20:24:36.795: INFO/DEBUG(121): d30 0000000000000000 d31 3ff0000000000000
11-13 20:24:36.795: INFO/DEBUG(121): scr 80000012
11-13 20:24:36.865: INFO/DEBUG(121): #00 pc 000424e0 /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #01 pc 0004655e /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #02 pc 000466f0 /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #03 pc 00001110 /data/data/unecm4droid.kiio.es/lib/libndkfoo.so
11-13 20:24:36.865: INFO/DEBUG(121): #04 pc 000016da /data/data/unecm4droid.kiio.es/lib/libndkfoo.so
11-13 20:24:36.865: INFO/DEBUG(121): #05 pc 00001bda /data/data/unecm4droid.kiio.es/lib/libndkfoo.so
11-13 20:24:36.865: INFO/DEBUG(121): #06 pc 00001f2e /data/data/unecm4droid.kiio.es/lib/libndkfoo.so
11-13 20:24:36.865: INFO/DEBUG(121): #07 pc 00017034 /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #08 pc 00045744 /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #09 pc 0004ae8e /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #10 pc 0001bf98 /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #11 pc 00022bc4 /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #12 pc 00021a60 /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #13 pc 0005cf60 /system/lib/libdvm.so
11-13 20:24:36.865: INFO/DEBUG(121): #14 pc 0005d190 /system/lib/libdvm.so
11-13 20:24:36.876: INFO/DEBUG(121): #15 pc 000500d0 /system/lib/libdvm.so
11-13 20:24:36.876: INFO/DEBUG(121): #16 pc 00010f44 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): #17 pc 00010a30 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): code around pc:
11-13 20:24:36.876: INFO/DEBUG(121): 802424c0 20061861 f7d418a2 2000ea7c ebdaf7d4
11-13 20:24:36.876: INFO/DEBUG(121): 802424d0 58234808 b1036bdb f8df4798 2026c01c
11-13 20:24:36.876: INFO/DEBUG(121): 802424e0 0000f88c ec40f7d4 00060f8c fffe1ecc
11-13 20:24:36.876: INFO/DEBUG(121): 802424f0 fffe5140 000003a4 deadd00d f8dfb40e
11-13 20:24:36.876: INFO/DEBUG(121): 80242500 b503c02c bf00490a 188ba200 f853aa03
11-13 20:24:36.876: INFO/DEBUG(121): code around lr:
11-13 20:24:36.876: INFO/DEBUG(121): afd16134 000ef9b0 22022100 ec98f7f7 463289a1
11-13 20:24:36.876: INFO/DEBUG(121): afd16144 5080f421 81a04629 000ef9b4 ec1ef7f7
11-13 20:24:36.876: INFO/DEBUG(121): afd16154 bf00bd70 4604b510 000ef9b0 ec06f7f7
11-13 20:24:36.876: INFO/DEBUG(121): afd16164 bfbe2800 f42389a3 81a35380 6d21db02
11-13 20:24:36.876: INFO/DEBUG(121): afd16174 6523180b bf00bd10 b085b5f0 bf004c41
11-13 20:24:36.876: INFO/DEBUG(121): stack:
11-13 20:24:36.876: INFO/DEBUG(121): 464c90f0 000005a0
11-13 20:24:36.876: INFO/DEBUG(121): 464c90f4 afd146c9 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c90f8 afd42498 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c90fc afd43bc8 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c9100 00000000
11-13 20:24:36.876: INFO/DEBUG(121): 464c9104 afd156e3 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c9108 afd14699 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c910c afd14699 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c9110 afd146f0 /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c9114 802a3448 /system/lib/libdvm.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c9118 802a3448 /system/lib/libdvm.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c911c 0030e960 [heap]
11-13 20:24:36.876: INFO/DEBUG(121): 464c9120 0030e9b0 [heap]
11-13 20:24:36.876: INFO/DEBUG(121): 464c9124 afd146fd /system/lib/libc.so
11-13 20:24:36.876: INFO/DEBUG(121): 464c9128 df002777
11-13 20:24:36.876: INFO/DEBUG(121): 464c912c e3a070ad
11-13 20:24:36.876: INFO/DEBUG(121): #00 464c9130 465117b0 /dev/ashmem/mspace/dalvik-heap/2 (deleted)
11-13 20:24:36.876: INFO/DEBUG(121): 464c9134 80246563 /system/lib/libdvm.so
11-13 20:24:36.876: INFO/DEBUG(121): #01 464c9138 000b4890 [heap]
11-13 20:24:36.876: INFO/DEBUG(121): 464c913c 00000000
11-13 20:24:36.876: INFO/DEBUG(121): 464c9140 00000051
11-13 20:24:36.876: INFO/DEBUG(121): 464c9144 0030e960 [heap]
11-13 20:24:36.876: INFO/DEBUG(121): 464c9148 000b4890 [heap]
11-13 20:24:36.876: INFO/DEBUG(121): 464c914c 46512b88 /dev/ashmem/mspace/dalvik-heap/2 (deleted)
11-13 20:24:36.876: INFO/DEBUG(121): 464c9150 43277fac
11-13 20:24:36.876: INFO/DEBUG(121): 464c9154 802466f5 /system/lib/libdvm.so
我试图用gdb调试本机的过程,但我只给这个信息时,应用程序崩溃:
I tried to debug a native process using gdb but I only give this message when app crash:
Program received signal SIGSTOP, Stopped (signal).
有谁可以帮我找到了错误的线索?
Does anyone could help me find more clues about the error?
THX所有。
推荐答案
也许你不释放你分配了一定的参考,比如做大量的字符串与 ENV-&GT; NewStringUTF(路径)
。系统不照顾它,当你在本地code。要么你需要自己删除它,或者你需要让系统返回到Java code!
Maybe you are not freeing some references that you have allocated, for example doing lots of strings with env->NewStringUTF(path)
. The system does not take care of it when you are in native code. Either you need to delete it yourself or you need to let the system return to java code!
请参阅<一href="http://java.sun.com/docs/books/jni/html/refs.html#27567">http://java.sun.com/docs/books/jni/html/refs.html#27567
5.2释放参考
每个JNI引用消耗一定 量的存储器本身,在 除了采取的存储器 引用的对象。作为一个JNI程序员, 应注意的数量的 参考你的程序将使用 在给定的时间。特别是,你 应该意识到的上限 对局部引用数的 程序可以创建在过程中的任何一点 它的执行,尽管这些地方 引用最终会被释放 自动由虚拟机。 过多的参考创作,但 短暂的,可能会导致内存 疲惫。
Each JNI reference consumes a certain amount of memory by itself, in addition to the memory taken by the referred object. As a JNI programmer, you should be aware of the number of references that your program will use at a given time. In particular, you should be aware of the upper bound of the number of local references your program can create at any point during its execution, even though these local references will eventually be freed automatically by the virtual machine. Excessive reference creation, however transient, can lead to memory exhaustion.
这篇关于安卓:一段时间后,本机进程惹ReferenceTable溢出(的Android NDK)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!