我第一次使用JNI访问c库,我想用valgrind来检查是否有任何内存泄漏。 Valgrind在jvm中报告了如此多的泄漏:(来自Valgrind的JVM中的泄漏
用于Push/Poplocal框架来管理本地引用,当然也从Get(UTFChars/Arrays)中释放引用,除此之外它还报告AttachCurrentThread方法,实际上我通过DetachCurrentThread在我的回调函数中成功地将它分离出来
现在我只需要提醒/对我来说,我怀疑在我的应用程序退出并且valgrind已经执行了它的检查部分之后,图书馆的卸载和销毁还没有完成,希望能听到任何经历过这种情况的人的消息。
//示例代码
void event_callback(void .., int ..)
{
printf("--Enter event_callback Function--\n");
int detach = 0;
//store our jnienv for this thread
JNIEnv *g_env = NULL;
// if our jni env is not attached for this thread, then we will attach it
int getEnvStat = (*g_jvm)->GetEnv(g_jvm, (void **)&g_env, JNI_VERSION_1_6);
if (getEnvStat == JNI_EDETACHED)
{
//if not attached, then lets attached g_env
printf("JNIEnv not attached. Attaching..\n");
if ((*g_jvm)->AttachCurrentThread(g_jvm, (void **) &g_env, NULL) != 0)
{
printf("Failed to attach\n");
return;
}
else
{
detach = 1;
}
}
else if (getEnvStat == JNI_OK)
{
printf("GetEnv: jenv is just OK, already attached.\n");
}
else if (getEnvStat == JNI_EVERSION)
{
printf("GetEnv: version not supported\n");
return;
}
if((*g_env)->PushLocalFrame(g_env, 10)<0)
{
printf("Out of memory\n");
}
//...some useful code here
(*g_env)->PopLocalFrame(g_env, NULL);
if(detach == 1)
{
int result = (*g_jvm)->DetachCurrentThread(g_jvm);
printf("DetachCurrentThread result: %d\n", result);
}
printf("--Exit event_callback Function--\n");
}
报告:
== 20914 ==在1块432个字节中记录损失903 1035的
都可能丢失== 20914 = = at 0x4028876:malloc(vg_replace_malloc.c:236)
== 20914 == by 0x4950461:os :: malloc(unsigned int)(在/ usr/lib/jvm/java-7-openjdk-i386/jre中/ LIB/I386 /客户端/立bjvm.so)
== 20914 == by 0x464470C:CHeapObj :: operator new(unsigned int)(在/ usr/lib/jvm/java-7-openjdk -i386/jre/lib/i386/client/libjvm.so)
== 20914 == by 0x496BB13:ParkEvent :: Allocate(Thread *)(在/ usr/lib/jvm/java-7-openjdk -i386/jre/lib/i386/client/libjvm .so)
== 20914 == by 0x4A13CCD:Thread :: Thread()(in /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
== 20914 ==由0x4A15091:JavaThread :: JavaThread(布尔)(以/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
== 20914 == by 0x4853723:attach_current_thread.isra.103.part.104(in /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
== 20914 ==由0x7B17791:event_callback(在/home/Wrapper/TJNIBridge/libJNIBridge.so)
== 20914 ==由0x7B44431:xmpp_event_main(my_xmpp.c:562)
== 20914 == by 0x412146D:clone(clone.S:130)
我还从jvm lib中粘贴了一些下面的漏洞。
== == 20914 4612(1,284直接,间接3,328)字节1块负的战绩1009 1,035
== == 20914在0x4028876肯定失去了:的malloc(vg_replace_malloc.c :236)
== 20914 == by 0x4950461:os :: malloc(unsigned int)(在/ usr/lib/jvm/java-7-openjdk -i386/jre/lib/i386/client/libjvm中。所以)
== 20914 == by 0x464470C:CHeapObj :: operator new(unsigned int)(在/ usr/lib/jvm/java-7-openjdk -i386/jre/lib/i386/client/libjvm中。所以)
== == 20914通过0x4A14BE9:WatcherThread ::开始()(在/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
== 20914 == by 0x4A192DF:Threads :: create_vm(JavaVMInitArgs *,bool *)(在/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so中)
== 20914 == by 0x4865BD8:JNI_CreateJavaVM(in /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
== 20914 ==由0x41ECD30:start_thread(pthread_create.c:304)
== 20914 ==由0x412146D:克隆(clone.S:130)
== 20914 ==在1块的8个字节绝对失去损失记录41 1035的
== 20914 ==在0x4028876:malloc的(vg_replace_malloc.c:236)
== 20914 ==由0x4950461:OS :: malloc(unsigned int)(在/ usr/lib/jvm/java-7-openjdk -i386/jre/lib/i386/client/libjvm中.so)
== 20914 == by 0x464470C:CHeapObj :: operator new(unsigned int)(in/usr/lib/jvm/java-7-openjdk -i386/jre/lib/i386/client/libjvm .so)
== 20914 == by 0x470E29D:CSpaceCounters :: CSpaceCounters(char const *,int,unsigned int,ContiguousSpace *,GenerationCounters *)(在/ usr/lib/jvm/java-7-openjdk- i386/jre/lib/i386/client/libjvm.so)
== 20914 == by 0x47A3BF9:DefNewGeneration :: DefNewGeneration(ReservedSpace,unsigned int,int,char const *)(在/ usr/lib/jvm中/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
== 20914 ==通过0x47FC623:GenerationSpec :: init(ReservedSpace,int,GenRemSet *)(在/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
== 20914 == by 0x47EF9D4:GenCollectedHeap :: initialize()(in /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
== 20914 ==由0x4B95FF3:??? (在/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so)
的Ubuntu 11.10 OpenJDK 7的