我经常看到很多
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()
),这是我需要关注的吗?或者事实上,无论如何我还能做些什么吗?
我只是在问,因为我正在尝试追踪崩溃错误并消除所有可能性。
感谢。
答案 0 :(得分:5)
由于您没有编写本机代码,因此可能无法执行任何操作。
如评论中所述,警告存在是为了帮助开发人员找到固定内存的案例(例如GetCharArrayElements
)并且永远不会释放它。由于日志中的引脚数包括峰值16并且不会更高,因此可能正在调用“释放”,并且内存仍然固定,因为引脚的代码尚未完成访问数组(即存在是固定它的15个“实时”物体。
引脚表的最大总大小为1024.如果超出此值,VM将强烈报告问题(它将写入特定的日志消息然后中止)。如果您没有看到,那么这些消息与您的崩溃无关,您可以忽略它们。