JNI:数组0x的引脚数... - 我需要担心什么?

时间:2014-03-18 16:49:11

标签: 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 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 */
    }
}

...在Jni.c中 - 而且我知道它的含义,但鉴于我不是用本机编写的,因此不能手动显式地释放任何东西,并且通常整理对象等(nulling,甚至打电话给System.gc()),这是我需要关注的吗?或者事实上,无论如何我还能做些什么吗?

我只是在问,因为我正在尝试追踪崩溃错误并消除所有可能性。

感谢。

1 个答案:

答案 0 :(得分:5)

由于您没有编写本机代码,因此可能无法执行任何操作。

如评论中所述,警告存在是为了帮助开发人员找到固定内存的案例(例如GetCharArrayElements)并且永远不会释放它。由于日志中的引脚数包括峰值16并且不会更高,因此可能正在调用“释放”,并且内存仍然固定,因为引脚的代码尚未完成访问数组(即存在是固定它的15个“实时”物体。

引脚表的最大总大小为1024.如果超出此值,VM将强烈报告问题(它将写入特定的日志消息然后中止)。如果您没有看到,那么这些消息与您的崩溃无关,您可以忽略它们。