从 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;

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