Recibo este error en un programa que crea varios (cientos de miles) objetos HashMap con unas pocas (15-20) entradas de texto cada uno. Estas cadenas deben recopilarse todas (sin dividirse en cantidades más pequeñas) antes de enviarlas a una base de datos.java.lang.OutOfMemoryError: el límite superior del GC excedió
Según Sun, el error ocurre "si se gasta demasiado tiempo en la recolección de basura: si más del 98% del tiempo total se gasta en recolección de basura y se recupera menos del 2% del montón, un OutOfMemoryError será arrojado ".
Aparentemente, se podría utilizar la línea de comandos para pasar argumentos a la JVM para
- Aumentar el tamaño del montón, a través de "-Xmx1024m" (o más), o
- Desactivación de la comprobación de errores por completo, vía "-XX: -UseGCOverheadLimit".
El primer enfoque funciona bien, el segundo termina en otro java.lang.OutOfMemoryError, esta vez sobre el montón.
Entonces, pregunta: ¿hay alguna alternativa programática para esto, para el caso de uso particular (es decir, varios pequeños objetos HashMap)? Si utilizo el método HashMap clear(), por ejemplo, el problema desaparece, pero también lo hacen los datos almacenados en HashMap. :-)
El tema también se discute en un related topic in StackOverflow.
Es posible que tenga que cambiar su algoritmo y el uso de algún tipo de estructura de datos más eficiente. ¿Puede decirnos qué algoritmo está tratando de implementar, que requiere tanta cantidad de HashMaps? – Ankur
Acabo de leer archivos de texto muy grandes (cientos de miles de líneas cada uno), sobre los cuales no tengo control, es decir, no se pueden desglosar. Para cada línea de texto, se construye un HashMap que contiene unos pocos (en realidad alrededor de 10) pequeños valores de cadena, utilizando los mismos nombres de campo de base de datos una y otra vez. Idealmente, me gustaría poder leer todo el archivo antes de enviar los datos a la base de datos. – PNS
Parece que leer todo el archivo antes de enviar los datos a la base de datos es una solución realmente deficiente ... de hecho, no funciona en absoluto, dentro de las limitaciones muy reales en la memoria disponible. ¿Por qué quieres hacer eso de todos modos? ¿Qué quiere decir con "usar los mismos nombres de campo de base de datos una y otra vez"? nombres de campo como claves o valores? Si los campos son claves, solo usa una matriz, donde el campo está IMPLICADO por su posición ... y si son valores, interélalos antes de agregarlos a los mapas. Ayudaría saber cuáles son los datos. Aclamaciones. Keith. – corlettk