JNI的Java内存管理

我有两个问题:

  1. 如果我对方法进行JNI调用并且JNI方法泄漏内存,该怎么办? 一旦这个方法完成,JVM垃圾收集器就能够恢复该内存。 我听说JVM不管理JNI使用的堆空间? 但是JNI使用的内存是Java进程使用的内存的一部分?

  2. 是否绝对有必要使用JNI来实现IPC? 什么是其他流行的Java技术,还是有一个开源库来实现Java中的共享内存?

  1. 否:“JNI框架不为在本机端执行的代码分配的非JVM内存资源提供任何自动垃圾收集”( 维基百科 )。
  2. 不,Java有套接字 ,甚至是ProcessBuilder。 使用MappedByteBuffer可以实现共享内存。
  1. 您需要释放在本机代码中创建的任何os资源,例如文件描述符,内存地址(由malloc等分配),因为它们不与任何jvm实例绑定。
  2. 您可以考虑使用Memory-Mapped Files ( 示例 )。

  3. 您可以在IPC上下文中使用RPC(在计算机和计算机之间),例如套接字,Web服务,JMS等。

  1. 很可能是 – 虽然我不完全确定是否存在清除记忆的方法。
  2. 看看ProcessBuilder – 排除JNI以实现IPC可能会有所帮助。