从 JNI 清除 java 堆 space 中的内存
Clearing a memory in java heap space from JNI
有办法吗?我知道 java 中的垃圾收集器如果我取消引用它最终会这样做。但是我需要立即清除字节数组内存,因为它是关键内存(密码等)。因此我试图通过 JNI 清除内存。有办法吗?
我的 java 代码:
public void clearBytes(byte[] data) {
clear(data);
}
//private native method clear(byte[] bytes);
private native void clear(byte[] arr);
这是我的 JNI 代码
JNIEXPORT void JNICALL Java_com_java_self_EncryptorUtil_clear(JNIEnv *env, jobject obj, jbyteArray arr)
{
//code to free/delete/clear memory
free(arr);
return;
}
我正在尝试清除 "data" 指向的相同内存
如果你们还需要什么,请告诉我。
谢谢。
如果本机代码是标准 C 语言,那么 free()
永远无法保证它会清除内存。而且,将 JVM 分配的数据释放到 C malloc 池中是否合法?对我来说似乎很危险,但我不使用 JNI。请注意,Java 层仍然至少有一个对您刚刚释放的内存的引用 (data
)。
我认为您想做的是用零覆盖字节数组,但无论如何您都可以在 Java 中这样做。一旦你覆盖了它,消除了秘密,你就不会在意垃圾收集器何时最终开始收集它了。
for (int k; k<data.length; k++)
data[k] = 0;
也许您对不可变的字符串(因此您不能覆盖它)和可变的字节数组(因此您可以覆盖它)之间的区别感到困惑。
有办法吗?我知道 java 中的垃圾收集器如果我取消引用它最终会这样做。但是我需要立即清除字节数组内存,因为它是关键内存(密码等)。因此我试图通过 JNI 清除内存。有办法吗?
我的 java 代码:
public void clearBytes(byte[] data) {
clear(data);
}
//private native method clear(byte[] bytes);
private native void clear(byte[] arr);
这是我的 JNI 代码
JNIEXPORT void JNICALL Java_com_java_self_EncryptorUtil_clear(JNIEnv *env, jobject obj, jbyteArray arr)
{
//code to free/delete/clear memory
free(arr);
return;
}
我正在尝试清除 "data" 指向的相同内存 如果你们还需要什么,请告诉我。
谢谢。
如果本机代码是标准 C 语言,那么 free()
永远无法保证它会清除内存。而且,将 JVM 分配的数据释放到 C malloc 池中是否合法?对我来说似乎很危险,但我不使用 JNI。请注意,Java 层仍然至少有一个对您刚刚释放的内存的引用 (data
)。
我认为您想做的是用零覆盖字节数组,但无论如何您都可以在 Java 中这样做。一旦你覆盖了它,消除了秘密,你就不会在意垃圾收集器何时最终开始收集它了。
for (int k; k<data.length; k++)
data[k] = 0;
也许您对不可变的字符串(因此您不能覆盖它)和可变的字节数组(因此您可以覆盖它)之间的区别感到困惑。