日期:2014-05-20  浏览次数:20576 次

JNI 删除本地引用后,如何判断已经被JVM回收掉了?
    在native方法中写下面一段代码,试图判断引用的对象是否被回收:

jstring jstr = env->NewStringUTF("test");
env->DeleteLocalRef(jstr);
if(JNI_TRUE == env->IsSameObject(jstr, NULL))
{
    //分支1
    //局部引用的对象已经被回收
]
else
{
    //分支2
    //局部引用的对象没有被被回收
}

程序运行的时候,进入了分支2,是我判断的方法不对,还是引用的对象没有被回收呢?如果是我的判断方法不对,哪位朋友能告诉我下怎么判断呢;先谢谢了。
jni

------解决方案--------------------
引用:
引用:有没有类似的打印语句,打印一下jstr呢
或者使用一下jstr对象,访问它的成员方法,如果是null,会报异常
打印了一下,能够打印出来;删除了本地引用,jvm却没有立即回收引用的对象吗,这个不会造成内存的泄漏吧?

不会的,即使不显式调用DeleteLocalRef,native方法返回后也会被jvm自动回收

另外DeleteLocalRef只是允许垃圾回收器立即回收对象,也不代表马上就回收,可以试试等足够的时间后,再查看