代码之家  ›  专栏  ›  技术社区  ›  laminatefish

JNI:数组0x…-上的管脚计数有什么我需要担心的吗?

  •  2
  • laminatefish  · 技术社区  · 12 年前

    我经常看到

    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中-我知道它的含义,但考虑到我不是用本机编写的,因此无法手动显式地发布任何内容,并且通常对对象等(无效,甚至调用 System.gc() )这是我需要担心的吗?或者事实上,无论如何,我能做些什么吗?

    我之所以这么问,只是因为我正在努力追踪一个崩溃bug,并消除所有可能性。

    谢谢

    1 回复  |  直到 12 年前
        1
  •  5
  •   fadden    12 年前

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

    正如评论中所指出的,警告的存在是为了帮助开发人员发现他们正在锁定内存的情况(例如。 GetCharArrayElements )并且永远不会释放它。由于您所包含的日志中的pin数在16处达到峰值,并且不会更高,因此很可能正在调用“release”,并且内存仍然被锁定,因为锁定它的代码尚未完成对阵列的访问(即,有15个“活动”对象被锁定)。

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

    推荐文章