JNI的Java内存管理
我有两个问题:
-
如果我对方法进行JNI调用并且JNI方法泄漏内存,该怎么办? 一旦这个方法完成,JVM垃圾收集器就能够恢复该内存。 我听说JVM不管理JNI使用的堆空间? 但是JNI使用的内存是Java进程使用的内存的一部分?
-
是否绝对有必要使用JNI来实现IPC? 什么是其他流行的Java技术,还是有一个开源库来实现Java中的共享内存?
- 否:“JNI框架不为在本机端执行的代码分配的非JVM内存资源提供任何自动垃圾收集”( 维基百科 )。
- 不,Java有套接字 ,甚至是ProcessBuilder。 使用MappedByteBuffer可以实现共享内存。
- 您需要释放在本机代码中创建的任何os资源,例如文件描述符,内存地址(由malloc等分配),因为它们不与任何jvm实例绑定。
-
您可以考虑使用Memory-Mapped Files ( 示例 )。
-
您可以在IPC上下文中使用RPC(在计算机和计算机之间),例如套接字,Web服务,JMS等。
- 很可能是 – 虽然我不完全确定是否存在清除记忆的方法。
- 看看ProcessBuilder – 排除JNI以实现IPC可能会有所帮助。