1 回答

TA貢獻1834條經驗 獲得超8個贊
我懷疑是釋放問題。
如果我有像這樣的超級簡單的Java代碼
package recipeNo026;
public class PassArray {
public static native void passDoubleArray(double[] array);
static { System.loadLibrary("PassArray"); }
public static void main(String[] args) throws Exception {
for(int i=0; i<100; i++) {
double[] doubleArray = new double[1_000_000_000];
passDoubleArray(doubleArray);
Thread.sleep(1000);
}
}
}
JNI本機代碼除了調用stuff之外沒有其他調用
JNIEXPORT void JNICALL Java_recipeNo026_PassArray_passDoubleArray
(JNIEnv * env, jclass obj, jdoubleArray array) {
printf ("Double array\n");
jboolean isCopy;
jdouble *doubleBody = (*env)->GetDoubleArrayElements(env, array, &isCopy);
(*env)->ReleaseDoubleArrayElements(env, array, doubleBody, JNI_ABORT);
}
Java 堆和本機代碼的內存消耗似乎都非常穩定。您可以看到代碼繼續運行時本機內存是如何分配和釋放的。
我肯定會開始尋找從您的包裝器調用的部分代碼中的泄漏JNI。
另外,請注意這樣一個事實,即使您根本不調用本機代碼(例如JNI),本機內存也會增長。畢竟,Java 在某些時候必須使用malloc它自己的堆進行分配??纯催@里:
public static void main(String[] args) throws Exception {
int size = 10;
double [][] array = new double[100][1];
for(int i=0; i<100; i++) {
array[i] = new double[size];
size = size * 2;
System.out.println("Allocating: " + size);
Thread.sleep(1000);
}
}
沒有JNI電話了?,F在,讓我們運行該應用程序。
> java -Xmx4G -Xms512m -Djava.library.path=:./lib -cp target recipeNo026.PassArray
library: :./lib
Allocating: 20
Allocating: 40
Allocating: 80
Allocating: 160
Allocating: 320
Allocating: 640
Allocating: 1280
Allocating: 2560
Allocating: 5120
Allocating: 10240
Allocating: 20480
Allocating: 40960
Allocating: 81920
Allocating: 163840
Allocating: 327680
Allocating: 655360
Allocating: 1310720
Allocating: 2621440
Allocating: 5242880
Allocating: 10485760
Allocating: 20971520
Allocating: 41943040
Allocating: 83886080
Allocating: 167772160
Allocating: 335544320
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at recipeNo026.PassArray.main(PassArray.java:25)
讓我們看一下 Java 進程的本機內存消耗(隨著時間的推移)。
添加回答
舉報