mapa java
¿Qué es java mmap? ¿Descubrímoslo juntos?
mmap asigna un archivo u otro objeto a la memoria. El archivo se asigna a varias páginas. Si el tamaño del archivo no es la suma de los tamaños de todas las páginas, el espacio no utilizado de la última página. sea claro. mmap juega un papel importante en el sistema de llamadas de mapeo del espacio del usuario.
Actualmente, el mmap proporcionado por Java solo proporciona mapeo de archivos de memoria y otras operaciones de IO no tienen funciones de mapeo de memoria.
Los archivos mapeados en memoria de Java ya están en el paquete java.nio, pero todavía son un concepto bastante nuevo para muchos desarrolladores de programas. Después de la introducción de NIO, Java IO ha sido bastante rápido y los archivos mapeados en memoria proporcionan las operaciones de IO más rápidas posibles en Java. Es por eso que esas aplicaciones Java de alto rendimiento deberían usar archivos mapeados en memoria para conservar los datos.
¿Para qué sirve mmap en Java?
1. Utilice mmap para proporcionar E/S asignadas en memoria para archivos normales para evitar la sobrecarga de rendimiento causada por las llamadas al sistema (lectura, escritura, lseek). Al mismo tiempo, se reduce la cantidad de copias de datos en el búfer del núcleo y el espacio de direcciones del proceso.
2. Utilice archivos especiales para proporcionar un mapeo de memoria anónimo.
3. Utilice shm_open para proporcionar un área de memoria compartida Posix entre procesos no relacionados.
¿Cómo se utiliza mmap en Java? (Para obtener más detalles, consulte la clase OffsetIndex en el código fuente de Kafka)
Operar archivos equivale a operar un ByteBuffer.
public?class?TestMmap?{público indefinido?static?String?path?=?"C:\\Users\\64371\\Desktop\\mmap"; public?static?void?main(String[]?args)? throws?IOException?{archivo indefinido?=?new?File(ruta,?"1"); RandomAccessFile?randomAccessFile?=?new?RandomAccessFile(archivo1,?"rw"); //La asignación es de 2 kb, entonces el archivo generado también es de 2 kb MappedByteBuffer?mmap?=?randomAccessFile.getChannel().map(FileChannel.MapMode.READ_WRITE,?0,?len); isReadOnly( )); System.out.println(mmap.position()); System.out.println(mmap.limit()); //Después de escribir datos, JVM forzará la actualización mmap.put("a después de salir " .getBytes()); mmap.put("b".getBytes()); mmap.put("c".getBytes()); mmap.put("d".getBytes()); out.println(mmap.position()); //System.out.println(mmap.limit()); // //mmap.force() //Consulte OffsetIndex para forzar el mmap asignado; reciclarse, no es necesario esperar hasta el próximo GC, unmap(mmap); // ¿Necesita ejecutar unmap(mmap); de lo contrario, se informará un error en Windows //Windows?won't?let?us? modificar?la?longitud?del?archivo?mientras?el?archivo?está?mmappeado //java.io.IOException:?La operación solicitada no se puede realizar en un archivo abierto utilizando un área asignada por el usuario randomAccessFile.setLength(len/2 ); mmap?=?randomAccessFile.getChannel() .map(FileChannel.MapMode.READ_WRITE,?0,?len/2); //¿Un?mapeo,?una vez?establecido,?no?depende?de? el?canal?del?archivo //que?fue ?utilizado?para?crearlo?.?El?cierre?del?canal?,?en?particular,?no?tiene?ningún?efecto?sobre?la?validez?del?archivo? ?mapping.randomAccessFile.close(); mmap.put(128,?"z".getBytes()[0]); (MappedByteBuffer?bb)?{undefinido Cleaner?cl ?=?((DirectBuffer)bb).cleaner();
si?(cl?!=?null) cl.clean();