1

初めて JNI を使用して ac ライブラリにアクセスし、valgrind を使用してメモリ リークをチェックすることを考えました。Valgrind は、jvm で非常に多くのリークを報告しました。:(

ローカル参照を管理し、もちろん必要な Get(UTFChars/Arrays) から参照を解放するために Push/Poplocal フレームを使用しました。それとは別に、実際にコールバック関数で DetachCurrentThread を介して正常にデタッチしたときに、AttachCurrentThread メソッドで失われた可能性があることも報告します。

そして今、報告されたリークはまったく真実ではなく、特にサーバー側のアプリケーションには影響しないというアドバイス/説明が必要です。私にとっては、アプリが終了し、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,035 の損失レコード 903 で 1 ブロックの 432 バイトが失われた可能性があります

==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.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() (/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so 内)

==20914== by 0x4A15091: JavaThread::JavaThread(bool) (/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so 内)

==20914== by 0x4853723: attach_current_thread.isra.103.part.104 (/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so 内)

==20914== by 0x7B17791: event_callback (/home/Wrapper/TJNIBridge/libJNIBridge.so 内)

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

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

また、jvm lib から報告されたリークの一部をすべての下に貼り付けました。

==20914== 1 ブロックで 4,612 (直接 1,284、間接 3,328) バイトが確実に失われています 1,035 の損失記録 1,009

==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.so 内)

==20914== by 0x464470C: CHeapObj::operator new(unsigned int) (/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so 内)

==20914== by 0x4A14BE9: WatcherThread::start() (/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 (/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so 内)

==20914== by 0x41ECD30: start_thread (pthread_create.c:304)

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

==20914== 1 ブロック中の 8 バイトは確実に損失レコード 41/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.so 内)

==20914== by 0x464470C: CHeapObj::operator new(unsigned int) (/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 内) 。それで)

==20914== by 0x47FC623: GenerationSpec::init(ReservedSpace, int, GenRemSet*) (/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so 内)

==20914== by 0x47EF9D4: GenCollectedHeap::initialize() (/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so 内)

==20914== by 0x4B95FF3: ??? (/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client/libjvm.so 内)

Ubuntu 11.10 OpenJDK 7

4

1 に答える 1