java - 如何释放 Java 端本地方法分配的内存?

标签 java c++ memory-leaks java-native-interface native

我正在尝试将字节数组(带有随机数据)从 native 传递到 Java,但我不确定这是否会导致任何内存泄漏。这是 C++ 代码。

JNIEXPORT jbyteArray JNICALL Java_com_sample_test_jni_TestJNI_return_1byte_1array
(JNIEnv *env, jobject obj) {
  unsigned char *byteArray = new unsigned char[LENGTH];
  srand(12345);
  for(int i = 0;i < LENGTH;i++) {
    byteArray[i] = rand() % 64;
  }
  jbyteArray data = (env)->NewByteArray(LENGTH);
  env->SetByteArrayRegion(data, 0, LENGTH, (jbyte*)byteArray);
  delete(byteArray);
  return data;
}

这是 Java 代码。

class TestJNI {
  static {
    System.loadLibrary("foobar");
  }
  public native byte[] return_byte_array();
  public static void main(String[] args) {
    byte[] data = new TestJNI().return_byte_array();
    System.out.println("Data length " + data.length);
  }
}

我怀疑在 native 代码中分配的 jbytearray 是否会被 Java 垃圾收集。我无法在本地释放它。

此外,是否有很好的文档通过示例描述 JNI 内存管理?

最佳答案

Java GC 应该清理您分配的所有对象。

参见 this answer了解更多详情。

关于java - 如何释放 Java 端本地方法分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30634790/

相关文章:

C++循环逻辑错误?

c++ - 为什么 Valgrind 给出 "Invalid read of size 1"错误?

c++ - 堆栈展开动态创建的对象,其构造函数也作用于堆

android - Android studio 3 中找不到 HPROF Analyzer 工具

java - 部署/发布/调试 Java Web 应用程序的常见做法

java - 参数索引超出范围(2 > 参数个数,即 1)

java - 非线程安全单例中的部分构造对象

c++ - 指向所有者类的指针

java - Hibernate - 在条件限制中添加另一个类的属性

azure - 如何分析 "azure web apps"的内存泄漏(PaaS)