JNI是用于Java代码与本地(C/ c++)代码通信的接口。
谷歌设置了每个Dalvik虚拟机(VM)(即每个Dalvik进程)51200个全局引用的限制。 如果超过这个限制,虚拟机将被杀死。 这种情况称为过多的JNI引用。
创建JNI全局引用是为了防止Java对象的垃圾收集。
如果在logcat日志中出现以下消息,说明JNI引用太多,没有被释放:
3-07 21:10:35.648 1318 3794 F art :
art/runtime/indirect_reference_table.cc:98] JNI ERROR (app bug): global reference table overflow (max=51200)
03-07 21:10:35.648 1318 3794 F art : art/runtime/indirect_reference_table.cc:98] 24757 of
com.android.server.TelephonyRegistry$Record (24757 unique instances)
03-07 21:10:35.648 1318 3794 F art : art/runtime/indirect_reference_table.cc:98] 25086 of java.lang.ref.WeakReference (25086 unique instances)
可以收集*.hprof和logcat日志进行分析。
首先,检查logcat日志中的JNI引用表,看看哪个对象有太多的引用。 然后,使用内存分析工具(MAT)对* hprof文件进行分析。
StrictMode工具也可以用来查找问题的根本原因。
03-07 21:10:35.648 1318 3794 F art :
art/runtime/indirect_reference_ta