utiliza sirve qué que programacion para optimizar máquina memoria maquina implicaciones cómo aumentar java memory

sirve - que es la jvm de java y sus implicaciones



¿Cuál es la mejor manera de acceder a la memoria en Java, similar a mmap? (5)

Estoy trabajando en una aplicación Java que necesita comunicarse con una aplicación C. La aplicación C usa memoria compartida y mmap para comunicarse, y necesito que la aplicación Java tenga acceso a la misma memoria.

Mi primer intento involucró el uso de llamadas JNI para recuperar datos de la memoria compartida, pero la sobrecarga de cada llamada JNI mató el rendimiento, por lo que me gustaría obtener acceso a esa memoria en Java y realizar la recuperación de datos en Java.

La idea que tengo es que necesitaría hacer lo siguiente:

  1. Use una llamada JNI para obtener la ubicación de la memoria compartida a la que debo adjuntar
  2. Crear un nuevo FileChannel ()
  3. Usa ese FileChannel para crear un MappedByteBuffer usando map ()

¿Es ésta la mejor manera de hacer ésto? Además, no estoy seguro de cómo crear el FileChannel para señalar la ubicación correcta de la memoria.


Escribiría un pequeño módulo C mmaps la memoria compartida y los sockets usados ​​para permitir que otra aplicación vea esa memoria (por ejemplo, su aplicación Java)


Si posee tanto la aplicación C como la aplicación Java, podrían simplemente comunicarse a través de las transmisiones de la consola, lo que es feo para los datos binarios pero posible. Cambiaría la memoria compartida por un estilo de paso de mensajes más, por ejemplo, un par de zócalos TCP / IP.

Por cierto, ¿qué tipo de información se transmite y qué tan grande es?


Si pudiera guardar los datos en un archivo en C y luego acceder al archivo desde Java, sería lo mejor. AFAIK no puede apuntar a la memoria de la forma en que le gustaría usar Java.


Busca usar ByteBuffer.allocateDirect . Aparentemente, estos búferes se pueden pasar sobre la capa JNI al código nativo que puede acceder a la memoria directamente.

Consulte esta página (citada a continuación) para obtener sugerencias.

Ahora, el código JNI no solo puede descubrir la dirección del espacio de la memoria nativa dentro de un búfer creado con ByteBuffer.allocateDirect () en el lado de Java, sino que puede asignar su propia memoria (con malloc (), por ejemplo) y luego llamar volver a la JVM para ajustar ese espacio de memoria en un nuevo objeto ByteBuffer (el método JNI para hacer esto es NewDirectByteBuffer ()).


¿No podría escribir una clase Java con algunos métodos nativos? Escriba la implementación del método nativo en C para hacer lo que quiera con mmap. Luego compila eso en una biblioteca nativa y agrégalo a tu tiempo de ejecución usando LD_LIBRARY_PATH. Esto te permitirá realizar llamadas C nativas en Java sin la sobrecarga de JNI (creo).

Algunos tutoriales aquí: enlace

Por ejemplo, escribiría una clase Java como:

JMMap.java public class JMMap { public native void write(...) }

Luego ejecute javah contra el archivo de clase para producir algo como:

JMMap.h JNIEXPORT void JNICALL Java_JMMap_write(JNIEnv *, jobject);

Implemente esto en un archivo .c. Compila eso a una biblioteca. Añádalo a la ruta LD y luego simplemente llame a la función Java.