2012-06-20 56 views
1

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

回答

0

JVM和Valgrind的別不要相處。只要在Valgrind下運行JVM就不會有任何輸入,這會帶來很多警告。

您將需要爲JVM錯誤生成抑制。

嘗試禁用JIT。