2012-01-19 10 views
9

Tenemos el concepto de punteros en C++. Ahora si asignamos algo de memoria en C++ y la pasamos a Java como referencia de objeto (usando JNI), entonces quién debería estar y quién la liberará.JNI, recolección de basura y Punteros-Java/C++ ¿quién debería hacer qué?

¿Será

1.) El recolector de basura lo hace automáticamente en Java?

2.) ¿Necesitamos explícitamente hacer una eliminación en el puntero en el método de finalizar la clase JNI envuelto?

3.) O simplemente debemos olvidar finalizar (como finalizadores no se puede confiar) y es responsabilidad de Java para llamar a un código C++, que elimina el objeto

4.) ¿O hay alguna manera de anular la planificación de la memoria directamente en Java (¿no está seguro de cómo Java interpreta un puntero de C++ para borrarlo)?

¿Cuál es la mejor práctica para hacer esto y viceversa (cuando pasamos objetos de Java a C++)?

Respuesta

8

Tenemos el concepto de punteros en C++. Ahora si asignamos algo de memoria en C++ y la pasamos a Java como referencia de objeto (usando JNI), entonces quién debería estar y quién la liberará.

La mejor estrategia es generalmente tener el asignador también para liberar los datos.

1.) ¿El recolector de basura lo hace automáticamente en Java?

El problema con esto es que no sabe cuándo, si alguna vez funcionará.

2.) ¿Necesitamos explícitamente hacer una eliminación en el puntero en el método de finalización de clase JNI envuelto?

Mejor tener un método de liberación() en Java en lugar de implicar que C++ tiene que eliminarlo. Es posible que desee que C++ recicle la memoria.

3.) O simplemente debemos olvidar finalizar (como finalizadores no se puede confiar) y es responsabilidad de Java para llamar a un código C++, que elimina el objeto

Si usted quiere decir, asignar la memoria en Java y pasarlo a C++ para poblar. Esta es mi preferencia.

Lo utilizaría puede usar ByteBuffer.allocateDirect() y puede llamar al ((DirectBuffer) buffer).cleaner().clean(); para limpiarlo de manera determinista.

Esto puede hacer que reciclar la memoria sea más simple, posiblemente el mismo búfer se puede usar durante la vida útil de la aplicación.

+0

+1 Definitivamente el asignador debe ser el de lanzar, y la asignación del lado de Java (si es posible) es "más limpio". – Viruzzo

+0

Estoy de acuerdo en que es más limpio, especialmente si Java llama a C++ en lugar de a la inversa. –

+0

Para el punto número 2, el método de lanzamiento en Java llamará al método C++ que realmente eliminará el objeto? ¿Cómo puede Java liberar directamente la memoria asignada en C++? – seahorse

Cuestiones relacionadas