有办法吗?我知道如果我取消引用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;
}
我正在尝试清除“数据”所指向的相同内存 请告诉我你们是否还需要其他东西。
谢谢。
答案 0 :(得分:1)
如果本机代码在标准C中,则free()
不能保证清除内存。而且,将JVM分配的数据取消分配到C malloc池是否合法?对我来说似乎很危险,但我不使用JNI。请注意,Java层仍然具有对刚释放的内存的至少一个引用(data
)。
我认为您想要做的是用零覆盖字节数组,但是您仍然可以在Java中执行此操作。一旦将其覆盖并清除了机密,您就不会在乎垃圾收集器最终何时开始收集它。
for (int k; k<data.length; k++)
data[k] = 0;
也许您对不可变的String(因此您不能覆盖它)和可变的字节数组(因此您可以覆盖它)之间的区别感到困惑。