java - r16 - ¿Cuándo y cómo se liberan los búferes directos de NIO?
ndk r13 (1)
Tengo una biblioteca C que quiere un búfer temporal para el espacio cero. Estoy considerando pasarle la dirección de un búfer de byte directo.
¿Se le permite a la VM reubicar el búfer antes de que finalmente se libere? La biblioteca nativa se mantendrá en el puntero después de que el marco JNI se va. Según entiendo, las referencias de objeto local JNI no se pueden almacenar en caché porque la máquina virtual puede reubicarlas durante el GC. ¿Esto se aplica a la dirección del búfer?
Entiendo que la máquina virtual liberará la memoria intermedia si asigné un buffer en Java y luego dejo que el objeto buffer salga del alcance. Si creo un nuevo buffer en código nativo usando NewDirectByteBuffer, ¿quién tiene la responsabilidad de liberar la memoria de respaldo?
¿Qué sucede si creo un nuevo buffer en código nativo usando NewDirectByteBuffer y una dirección que ya está siendo utilizada por un buffer directo? ¿El recuerdo será doblemente liberado? ¿La referencia de VM contará el bloque de memoria e intentará liberarlo cuando el último búfer al que se hace referencia sea basura?
¿Se le permite a la VM reubicar el búfer antes de que finalmente se libere?
No lo reubicará, porque el búfer directo no es parte del montón de GC.
Si creo un nuevo buffer en código nativo usando NewDirectByteBuffer, ¿quién tiene la responsabilidad de liberar la memoria de respaldo?
Es su responsabilidad (código nativo) liberarlo. La JVM no podía saber qué método se utilizó para asignar ese almacén de respaldo (podría malloc, podría ser un búfer estático, etc.)
¿Qué sucede si creo un nuevo buffer en código nativo usando NewDirectByteBuffer y una dirección que ya está siendo utilizada por un buffer directo?
Dado que la máquina virtual no intentará liberar la memoria cuya dirección se pasa a NewDirectByteBuffer, no pasará nada si pasa la misma dirección dos veces.