【发布时间】:2018-03-20 20:45:19
【问题描述】:
请考虑这种情况:
Java 和一些(昂贵的)原生资源之间存在联系,这是映射到 Java 的要求。问题是关于资源的生命周期以及这些资源如何在本机和 Java 上可用,只要它们需要。让我们假设我们可以根据需要在双向都有一个活动的 JNI 连接。
规则如下:
只要包装 Java 对象需要,资源就会保持活动。如果需要,可以对 Java 对象进行垃圾收集。
只要本机部分需要,资源就会保持活动。
如果 Java 对象已被 GC 处理,则应该存在一种“重生”该 Java 对象的机制。此 Java 包装器对象可能具有未映射到本机资源的字段,这些字段需要出现在转世对象中。
有一种机制可以通知本机部分 Java 作为客户端不再需要该资源(不保证将来不会再次请求)以及通知本机 Java 已决定不再需要其他客户端的资源。
可能的解决方案列表(以及为什么它们不起作用):
保留包装器的 WeakReference 映射:可能的 java 字段将出现问题,这些字段将被 GC 处理且无法重新创建
使用“finalize”和回收数据:这是不可能的,因为它最多被 GC 调用一次。
使用
.clone():它可能被覆盖并且可能丢失数据使用反射收集所有私有字段并重新应用于新创建的 Java 对象:构造函数未知(可能会产生各种副作用)
... ?
Here is the original (wrong) question。任何想法如何保护这些资源和 Java 之间的连接?
【问题讨论】:
标签: java garbage-collection jvm resources java-native-interface