java.lang.OutOfMemoryError: espacio de almacenamiento dinámico de Java al inicializar una matriz

Use java.util.BitSet , que empacará los bits en un octavo del espacio en comparación con el uso de una booleanmatriz.

La razón por la que los elementos de matriz booleana toman 1 byte en lugar de 1 bit es porque (la mayoría) de las arquitecturas de CPU no brindan la capacidad de leer y escribir directamente bits de memoria individuales. La unidad más pequeña que las PC pueden manipular tiene 8 bits. La JVM podría empaquetar los bits juntos, luego, para modificar un bit, leería el byte, lo modificaría y lo volvería a escribir, pero eso no funciona si múltiples hilos están modificando la matriz simultáneamente.

En cuanto a su matriz original, son mil millones de booleanos, un byte cada uno, que son mil millones de bytes o ~ 954 MB. Entonces, un montón de 1024 MB debería ser suficiente (?). Tal vez no pueda encontrar una porción contigua de memoria lo suficientemente grande, o tal vez no haya configurado el parámetro de memoria correctamente. Imprima el valor de Runtime.getRuntime().maxMemory()para averiguar el tamaño máximo de almacenamiento dinámico que está utilizando Java. Para 1024 MB, el parámetro debería ser -Xmx1024M.

Nota final: a partir de Java 7, puede usar guiones bajos en números para que sean más legibles. Entonces puedes escribir en 1_000_000_000lugar de 1000000000.

Respuesta 1

Simplemente solicite más tamaño de almacenamiento dinámico, por ejemplo, -X1500M definitivamente funciona. Su matriz ocupa 1000000000 bytes, pero necesita solicitar más porque el almacenamiento dinámico de Java se divide en generaciones nuevas y antiguas.

Respuesta: 2

Al iniciar la JVM, debe pasar un parámetro -Xmx para establecer el espacio de almacenamiento dinámico máximo como mayor.

También tenga en cuenta que las matrices tienen un tamaño máximo de Integer.MAX_VALUE

Respuesta: 3

En su lugar, podría usar un portaobjetos, evitando la necesidad de asignar todo el espacio a la vez, lo que puede solucionar el problema si el tamaño del montón es lo suficientemente grande. Necesita mucho espacio para contener tantos booleanos en una matriz; asegúrese de que el tamaño mínimo y máximo estén establecidos para el espacio de almacenamiento dinámico. Use algo como Lista para completar solo los valores cuando sea necesario también. Si realmente lo necesita como una matriz, hay formas de volver a convertirlo (la colección de matrices en apache commons le permite usar Arrays.toPrimitive).

Respuesta: 4

Las matrices booleanas se almacenan como bytes:

https://forums.oracle.com/thread/2550321

Creo que debe repensar cómo lo hace: crear estructuras de datos con tamaños del orden de gigabytes está más allá de las capacidades del hardware actual.

Respuesta: 5

Tengo una redis key / value store que contiene blobs (tamaño en decenas de MB), y el cliente jedis que estoy usando en mi aplicación java devuelve una matriz de bytes del método get de la conexión jedis. Actualmente yo ...

Quiero usar el paquete de mosaicos incluido de la solución de osmdroid para usar mapas sin conexión ya que Mobile Atlas Creator no funcionó para mí (quiero niveles de zoom de 16x que no es posible con esta herramienta). Los ...

¿Cómo puedo encontrar el nombre de la máquina virtual Java actualmente en ejecución? Quiero obtenerlo de la API de Java. Gracias

Tengo cosas (digamos, por contexto, números) que pueden realizar operaciones en su propio tipo: interfaz Número <N> {N add (N to); } class Int implementa Number <Int> {Int add (Int to) {.....