Ana sayfamda yerel bir işlev çağırıyorum ve bir süre döngüsünün içinde.Java'da yerel kod çağrılırken bellek sızıntısı olup olmadığı nasıl bilinir?
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();
}
}
aşağıdaki programın çıktısı: o bir bellek sızıntısı tahmin
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
(yaklaşık 1 dakika boyunca çalışan). Ama ben pencerelerin görev yöneticisi açtığınızda, işlemin boyutu javaw.exe artmaya devam ediyor (her iterasyonda 100 KB). Bir bellek sızıntısı olup olmadığını bilmek mi yoksa sadece göz ardı mıyım? VEYA Bu, yerel işlevde bir bellek sızıntısı olduğu anlamına mı geliyor?
FYI, herhangi bir bellek sızıntısı ile ilgili yerel işlevimi iki kez kontrol ettim!
Teşekkürler!
DÜZENLEME:
Yerli fonksiyonu:
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. Yerel işlevinizi de gönderin. – Azodious
@Azodious aslında oldukça uzun. C++ 'da WMI kullanıyorum. Ama jni değişkenlerin kullanıldığı kısmı yayınlayabilirim. :) – HashimR
Bellek kullanımında büyük bir değişiklik görmüyorum. Nispeten istikrarlı görünüyor. Bir şey mi eksik? –