从JNI清除Java堆空间中的内存

时间:2019-03-21 01:40:38

标签: java java-native-interface

有办法吗?我知道如果我取消引用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;
    }

我正在尝试清除“数据”所指向的相同内存 请告诉我你们是否还需要其他东西。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果本机代码在标准C中,则free()不能保证清除内存。而且,将JVM分配的数据取消分配到C malloc池是否合法?对我来说似乎很危险,但我不使用JNI。请注意,Java层仍然具有对刚释放的内存的至少一个引用(data)。

我认为您想要做的是用零覆盖字节数组,但是您仍然可以在Java中执行此操作。一旦将其覆盖并清除了机密,您就不会在乎垃圾收集器最终何时开始收集它。

    for (int k; k<data.length; k++)
        data[k] = 0;

也许您对不可变的String(因此您不能覆盖它)和可变的字节数组(因此您可以覆盖它)之间的区别感到困惑。