Java5でヒープダンプを取得するためのJNIのサンプルコード

Java5でも(実行時にオプションで取得できるのだが)任意のタイミングで取得したかったのでちょっと調べてみた。ロックとかの制御が必要かも。

typedef  jint  (WINAPI * JDUMPHEAP)(JNIEnv* , jstring  , jboolean );

JNIEXPORT void JNICALL Java_sample_HeapDumper_dumpHeap(JNIEnv * env, jclass clazz, jstring str){

    HINSTANCE   hInstDLL;       
    JDUMPHEAP   JVM_DumpHeap;   
    
	if( (hInstDLL=LoadLibrary("jvm.dll"))==NULL){
		printf("error");
		return;
	}

    JVM_DumpHeap=(JDUMPHEAP)GetProcAddress(hInstDLL,"JVM_DumpHeap");
	  if (JVM_DumpHeap == NULL) {
     	printf("dump heap api error");
        return;
    }
    jboolean b =JNI_TRUE;
    JVM_DumpHeap(env,str,b);
    if(!FreeLibrary(hInstDLL)){
      printf("free library error");
    }
}