Sto chiamando una funzione nativa nel mio main ed è all'interno di un ciclo while.Come sapere se si tratta di una perdita di memoria o meno quando si chiama il codice nativo in 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();
}
}
l'uscita del seguente programma è il seguente: (in esecuzione per circa 1 minuto)
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
credo che non è una perdita di memoria. Ma quando apro il task manager di Windows, la dimensione del processo javaw.exe continua ad aumentare (100 KB per ciascuna iterazione). Vuoi sapere se si tratta di una perdita di memoria o dovrei semplicemente ignorarlo? OPPURE Significa che c'è una perdita di memoria nella funzione nativa?
FYI ho ricontrollato la mia funzione nativa di eventuali perdite di memoria!
Grazie!
EDIT:
funzione nativa:
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. inserisci anche la tua funzione nativa. – Azodious
@Azodious in realtà è piuttosto lungo. Sto usando WMI in C++. Ma posso pubblicare la parte in cui vengono utilizzate le variabili jni. :) – HashimR
Non vedo un gran cambiamento nell'utilizzo della memoria. Sembra essere abbastanza stabile. Mi sto perdendo qualcosa? –