2012-06-20 52 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。