Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JNI:阵列0x上的pin计数…-有什么我需要担心的吗?_Android_Java Native Interface_Dalvik - Fatal编程技术网

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感谢您的澄清。我没有注意到他正在/没有编写本机代码