Android JNI:阵列0x上的pin计数…-有什么我需要担心的吗?
我经常看到很多人Android JNI:阵列0x上的pin计数…-有什么我需要担心的吗?,android,java-native-interface,dalvik,Android,Java Native Interface,Dalvik,我经常看到很多人 03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 11 03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 12 03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 11
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 12
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 13
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 14
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 15
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
03-18 16:40:18.729: W/dalvikvm(22567): JNI: pin count on array 0x413e4488 ([C) is now 16
我知道这是由以下代码输出的
/*
* If we're watching global ref usage, also keep an eye on these.
*
* The total number of pinned primitive arrays should be pretty small.
* A single array should not be pinned more than once or twice; any
* more than that is a strong indicator that a Release function is
* not being called.
*/
if (kTrackGrefUsage && gDvm.jniGrefLimit != 0) {
int count = 0;
Object** ppObj = gDvm.jniPinRefTable.table;
while (ppObj < gDvm.jniPinRefTable.nextEntry) {
if (*ppObj++ == (Object*) arrayObj)
count++;
}
if (count > kPinComplainThreshold) {
LOGW("JNI: pin count on array %p (%s) is now %d\n",
arrayObj, arrayObj->obj.clazz->descriptor, count);
/* keep going */
}
}
/*
*如果我们在关注全局ref使用情况,也要关注这些。
*
*固定基元数组的总数应该非常小。
*单个阵列不应固定超过一次或两次;任何
*除此之外,这是一个强有力的指标,表明释放功能正在发挥作用
*没有被叫。
*/
if(kTrackGrefUsage&&gDvm.jniGrefLimit!=0){
整数计数=0;
对象**ppObj=gDvm.jniPinRefTable.table;
而(ppObjkPainthlainthReshold){
LOGW(“阵列%p(%s)上的JNI:pin计数现在为%d\n”,
arrayObj,arrayObj->obj.clazz->描述符,计数);
/*继续*/
}
}
。。。在Jni.c中——我知道它的含义,但考虑到我不是用本机编写的,因此不能显式地手动发布任何内容,并且通常对对象等(空值,甚至调用System.gc()
),这是我需要关注的问题吗?或者事实上,我能做点什么吗
我之所以这么问,是因为我正在努力追踪一个崩溃bug,并消除所有可能的情况
谢谢。由于您不是在编写本机代码,因此可能无法对此采取任何措施 如评论中所述,该警告的存在是为了帮助开发人员找到他们正在固定内存(例如通过
getCharrayElements
)而从不释放内存的情况。由于您包含的日志中的pin计数在16时达到峰值,并且不会更高,因此很可能正在调用“release”,并且内存保持固定,因为用于固定内存的代码尚未完成对阵列的访问(即,有15个“活动”对象将其固定)
pin表的最大总大小为1024。如果超过该值,VM将报告问题(它将写入特定的日志消息,然后中止)。如果您没有看到这些消息,那么这些消息与您的崩溃无关,您可以忽略它们。您必须同时释放全局和本地ref。还要记住,全局ref表非常小(如果我没记错的话,有512个条目)@blackbelt:他没有编写本机代码。FWIW,本地ref表很小(512),但除非启用CheckJNI,否则全局ref表是无限的。这两个都与pin表无关,pin表的引入是为了支持将来压缩地面军事系统。@fadden感谢您的澄清。我没有注意到他正在/没有编写本机代码