假设我们手头有一个使用
当GC第二个使用
我的问题是:JVM在GC第一个使用
注:我在JNI文档和SO上都没有找到明确的答案。最有用的信息在这里http://www.ibm.com/developerworks/library/j-nativememory-linux/index.html :
直接的ByteBuffer对象自动清除其本地缓冲区,但只能作为Java堆GC的一部分执行此操作 - 因此它们不会自动响应于本机堆上的压力。
因此,看起来JVM将在GC传递期间释放后备缓冲区,但没有任何关于解除分配器的提及。是纯粹的
env->NewDirectByteBuffer()
创建的直接字节缓冲区,另一方面,我们有一个类似的直接缓冲区,但是使用ByteBuffer.allocateDirect()
创建。显然,这两个对象应该以相同的方式由JVM管理,包括对后备本机缓冲区的管理,在第一种情况下,用户提供了后备本机缓冲区,在第二种情况下,JVM从本机堆中分配了后备缓冲区。当GC第二个使用
ByteBuffer.allocateDirect()
实例化的对象时,JVM必须释放背景缓冲区。我的问题是:JVM在GC第一个使用
env->NewDirectByteBuffer()
实例化的对象时会尝试释放缓冲区吗?注:我在JNI文档和SO上都没有找到明确的答案。最有用的信息在这里http://www.ibm.com/developerworks/library/j-nativememory-linux/index.html :
直接的ByteBuffer对象自动清除其本地缓冲区,但只能作为Java堆GC的一部分执行此操作 - 因此它们不会自动响应于本机堆上的压力。
因此,看起来JVM将在GC传递期间释放后备缓冲区,但没有任何关于解除分配器的提及。是纯粹的
free()
还是其他东西?
/** * 表示我们不拥有的一块内存。(我们不接管由JNI NewDirectByteBuffer函数创建的直接缓冲区对应的内存。) */
- Sergio