Android: собственный процесс через некоторое время вызывает переполнение ReferenceTable (android-ndk) - PullRequest
7 голосов
/ 13 ноября 2010

Используя ndk, я скомпилировал код, написанный на C. Программа для конвертации файлов формата ecm, здесь нативный код: link . Я решил сделать с JNI по причинам оптимизации, потому что программа требует большого количества процессорной обработки.

Файлы для преобразования могут быть очень большими, от 200 МБ до 700 МБ. Все работает отлично, но при попытке конвертировать файлы размером более 600 МБ, ближе к концу процесса конвертации, приложение останавливается со следующим сообщением об ошибке:

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, но я выдаю это сообщение только при сбое приложения:

Program received signal SIGSTOP, Stopped (signal).

Кто-нибудь может помочь мне найти больше подсказок об ошибке?

Спасибо всем.

1 Ответ

8 голосов
/ 14 ноября 2010

Возможно, вы не освобождаете некоторые выделенные вами ссылки, например, делаете много строк с env->NewStringUTF(path).Система не заботится об этом, когда вы находитесь в нативном коде.Либо вам нужно удалить его самостоятельно, либо позволить системе вернуться к java-коду!

См. http://java.sun.com/docs/books/jni/html/refs.html#27567

5.2 Удаление ссылок

Каждая ссылка на JNIпотребляет определенное количество памяти само по себе, в дополнение к памяти, занятой упомянутым объектом.Как программист JNI, вы должны знать о количестве ссылок, которые ваша программа будет использовать в данный момент времени.В частности, вы должны знать о верхней границе числа локальных ссылок, которые ваша программа может создать в любой момент во время ее выполнения, даже если эти локальные ссылки в конечном итоге будут автоматически освобождены виртуальной машиной.Чрезмерное создание ссылок, хотя и временное, может привести к исчерпанию памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...