来自Valgrind的JVM泄漏

来自Valgrind的JVM泄漏,jvm,memory-leaks,valgrind,Jvm,Memory Leaks,Valgrind,第一次使用JNI访问c库时,我想到使用valgrind检查内存泄漏。Valgrind报告jvm中存在如此多的漏洞: 使用Push/Poplocal框架来管理本地引用,当然,还可以从GetUTFChars/Arrays释放引用,这需要进行修改。除此之外,它还报告了AttachCurrentThread方法可能丢失的情况,事实上,我通过回调函数中的DetachCurrentThread成功地将其分离 现在我只需要建议/解释,报告的泄漏根本不是真的,不会影响我的应用程序,尤其是服务器端的应用程序。对我

第一次使用JNI访问c库时,我想到使用valgrind检查内存泄漏。Valgrind报告jvm中存在如此多的漏洞:

使用Push/Poplocal框架来管理本地引用,当然,还可以从GetUTFChars/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个字节可能在1035的丢失记录903中丢失

==20914==at 0x402876:malloc vg_replace_malloc.c:236

==20914==by 0x4950461:os::mallocunsigned int in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==by 0x464470C:CHeapObj::operator newunsigned int in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==by 0x496BB13:ParkEvent::AllocateThread*in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==0x4A13CCD:Thread::Thread in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==0x4A15091:JavaThread::JavaThreadbool in/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==by 0x7B17791:event_回调在/home/Wrapper/TJNIBridge/libJNIBridge.so中

==20914==by 0x7B44431:xmpp_event_main my_xmpp.c:562

==20914==by 0x412146D:clone clone.S:130

我还将一些报告的泄漏粘贴在下面,全部来自jvm库

==20914==4612 1284直接,1个块中的3328间接字节在1035的丢失记录1009中肯定丢失

==20914==at 0x402876:malloc vg_replace_malloc.c:236

==20914==by 0x4950461:os::mallocunsigned int in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==by 0x464470C:CHeapObj::operator newunsigned int in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==0x4A14BE9:WatcherThread::start in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==0x4A192DF:Threads::在/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so中创建_-vmJavaVMInitArgs*,bool*

==20914==0x4865BD8:JNI_CreateJavaVM in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==by 0x41ECD30:start\u thread pthread\u create.c:304

==20914==by 0x412146D:clone clone.S:130

==20914==1个块中的8个字节肯定会在1035的丢失记录41中丢失

==20914==at 0x402876:malloc vg_replace_malloc.c:236

==20914==by 0x4950461:os::mallocunsigned int in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==by 0x464470C:CHeapObj::operator newunsigned int in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==by 0x470E29D:cspaceconters::cspaceconterschar const*,int,unsigned int,ContiguousSpace*,GenerationCounters*位于/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so中

==20914==by 0x47A3BF9:DefNewGeneration::DefNewGenerationReservedSpace,unsigned int,int,char const*in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==by 0x47FC623:GenerationSpec::initReservedSpace,int,GenRemSet*in/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so

==20914==0x47EF9D4:GenCollectedHeap::在/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

JVM和Valgrind相处不好。仅仅在Valgrind下运行JVM而没有为我提供任何输入就会发出大量警告

您需要为JVM错误生成抑制

尝试禁用JIT