我第一次使用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的