2011-11-23 7 views
9

私はメインでネイティブ関数を呼び出していますが、whileループの中にあります。Javaでネイティブコードを呼び出すときにメモリリークであるかどうかを確認するにはどうすればよいですか?

public static void main (String[] args) throws Throwable { 

     testDLL test = new testDLL(); 
     String ar[]; 
     while (true){ 
      System.out.println("Memory before garbage collection: " + Runtime.getRuntime().freeMemory());   
      ar = test.GetSomething("###");  
      test.finalize(); 
      System.gc(); 
      Thread.sleep(5000); 
      System.out.println("Memory after garbage collection: " + Runtime.getRuntime().freeMemory()); 
      System.out.println(); 
     } 
} 

次のプログラムの出力はある:私はそれがメモリリークはない推測

Memory before garbage collection: 1915288 
Memory after garbage collection: 1915136 

Memory before garbage collection: 1915136 
Memory after garbage collection: 1914984 

Memory before garbage collection: 1914984 
Memory after garbage collection: 1916624 

Memory before garbage collection: 1916624 
Memory after garbage collection: 1916472 

Memory before garbage collection: 1916472 
Memory after garbage collection: 1916320 

Memory before garbage collection: 1916320 
Memory after garbage collection: 1916168 

Memory before garbage collection: 1916168 
Memory after garbage collection: 1916624 

Memory before garbage collection: 1916624 
Memory after garbage collection: 1916472 

(約1分間実行しています)。しかし、私はWindowsのタスクマネージャーを開くと、プロセスのサイズjavaw.exeが増加し続けます(繰り返しごとに100 KB)。それはメモリリークかどうか、私はそれを無視する必要があるかどうかを知りたいですか?または、ネイティブ関数でメモリリークが発生していますか?

FYI私はメモリリークの私のネイティブ関数をダブルチェックしました!

ありがとうございます!

EDIT:

ネイティブ機能:

JNIEXPORT jobjectArray JNICALL Java_testDLL_GetSomething 
(JNIEnv * env, jobject jobj, jstring approvedJString){ 

    const int num = 100; 

    jboolean * isCopy; 
    jobjectArray serialNumArrJobj; 
    const char* approved = env->GetStringUTFChars(approvedJString, isCopy); 
    string serialNumArr[num]; 

    //* 
    * Long lengthy code here 
    * Populates the string array "serialNumArr" 
    *// 

    // ======== 

    env->ReleaseStringUTFChars(approvedJString, approved); 
    env->DeleteLocalRef(approvedJString); 
    env->DeleteLocalRef(jobj); 

    //////////// 

    int i, sizeOfArr = 0; 

    for(i = 0; i < num; i++) { 
     if (serialNumArr[i].empty()) 
      break; 
     else 
      sizeOfArr++; 
    } 

    serialNumArrJobj = (jobjectArray)env->NewObjectArray(sizeOfArr, 
     env->FindClass("java/lang/String"), 
     env->NewStringUTF("")); 


    for(i = 0; i < sizeOfArr; i++) { 
     env->SetObjectArrayElement(serialNumArrJobj, 
      i, 
      env->NewStringUTF(serialNumArr[i].c_str())); 
    } 

    return serialNumArrJobj; 
} 
+2

Pls。ネイティブ関数も投稿してください。 – Azodious

+0

@Azodious実際にはかなり長いです。私はC++でWMIを使用しています。しかし、私はjni変数が使われている部分を投稿することができます。 :) – HashimR

+0

私はメモリ使用量の変化はあまり見られません。比較的安定していると思われる。何か不足していますか? –

答えて

1

あなたの期待は見当違いです。 System.gc()はガベージコレクタのヒント以上になるとは予想できません。finalize()を呼び出すことはまったく間違っています。

+0

私はあなたが' finalize() 'と' System.gc() 'を削除してもまだメモリ漏れがあるとしても、問題を慎重に読んだことはないと思います。 – HashimR

0

モックテストのようなJavaコードのようなネイティブコードを直接呼び出す単体テストを書く必要があると思います。

関連する問題