【问题标题】:Clearing a memory in java heap space from JNI [duplicate]从JNI清除Java堆空间中的内存[重复]
【发布时间】:2019-08-11 20:16:21
【问题描述】:

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

我正在尝试清除“数据”所指向的相同内存 如果你们还需要什么,请告诉我。

谢谢。

【问题讨论】:

标签: java java-native-interface


【解决方案1】:

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

我认为您想要做的是用零覆盖字节数组,但无论如何您都可以在 Java 中做到这一点。一旦你覆盖了它,抹去了秘密,你就不会在乎垃圾收集器什么时候开始收集它了。

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

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

【讨论】:

  • 这个答案是正确的。您不能在 JNI 代码中释放 Java 对象。只需清除内存(在 Java 中),让 Java 垃圾收集器处理内存。
猜你喜欢
  • 1970-01-01
  • 2012-04-28
  • 2019-02-24
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2021-11-20
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多