私はメインでネイティブ関数を呼び出していますが、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;
}
Pls。ネイティブ関数も投稿してください。 – Azodious
@Azodious実際にはかなり長いです。私はC++でWMIを使用しています。しかし、私はjni変数が使われている部分を投稿することができます。 :) – HashimR
私はメモリ使用量の変化はあまり見られません。比較的安定していると思われる。何か不足していますか? –