que pila memoria funciona como and java serialization garbage-collection heap-memory out-of-memory

pila - Java está fuera del espacio de almacenamiento dinámico durante la serialización



que es el heap (2)

¿Es objOS un ObjectOutputStream ?

Si es así, entonces ese es tu problema: un ObjectOutputStream mantiene una fuerte referencia a todos los objetos que se escribieron para evitar escribir dos veces el mismo objeto (simplemente escribirá una referencia que diga "ese objeto que escribí antes con id x ").

Esto significa que efectivamente está perdiendo todas las posibilidades de ArrayList .

Puede restablecer ese "caché" llamando a reset() en su ObjectOutputStream . Como de todos modos no parece estar usando esa función, puede llamar a reset() directamente después de la llamada a writeObject() .

El siguiente código está causando un espacio de almacenamiento OutOfMemmoryError: para unos 3 millones de filas. La memoria asignada a JVM es de 4 GB, utilizando una instalación de 64 bits.

while (rs.next()) { ArrayList<String> arrayList = new ArrayList<String>(); for (int i = 1; i <= columnCount; i++) { arrayList.add(rs.getString(i)); } objOS.writeObject(arrayList); }

La memoria a la que hace referencia ArrayList es elegible para la recolección de basura en cada iteración del bucle while, y JVM interna llama a la recolección de basura ( System.gc() ) antes de lanzar un error OutOfMemory debido al espacio de almacenamiento dinámico.

Entonces, ¿por qué está ocurriendo la excepción?


Estoy de acuerdo con @Joachim.

La siguiente sugerencia fue un mito.

Además, se recomienda (en una buena convención de codificación) que no declare ningún objeto dentro del bucle . En su lugar, declare justo antes del inicio del ciclo y use la misma referencia para propósitos de inicialización. Esto le pedirá a su código que use la misma referencia para cada iteración y causará menos carga en el hilo de liberación de memoria (es decir, recolección de basura).

La verdad
He editado esto porque creo que puede haber muchas personas que (como yo antes de hoy) todavía creen que declarar un objeto dentro del bucle podría dañar la gestión de la memoria; Cuál está mal.
Para demostrar esto, he usado el mismo código publicado en para esto .
A continuación es mi fragmento de código

package navsoft.advskill.test; import java.util.ArrayList; public class MemoryTest { /** * @param args */ public static void main(String[] args) { /* Total number of processors or cores available to the JVM */ System.out.println("Available processors (cores): " + Runtime.getRuntime().availableProcessors()); /* * Total amount of free memory available to the JVM */ long freeMemory = Runtime.getRuntime().freeMemory(); System.out.println("Free memory (bytes): " + freeMemory); /* * This will return Long.MAX_VALUE if there is no preset limit */ long maxMemory = Runtime.getRuntime().maxMemory(); /* * Maximum amount of memory the JVM will attempt to use */ System.out.println("Maximum memory (bytes): " + (maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory)); /* * Total memory currently in use by the JVM */ System.out.println("Total memory (bytes): " + Runtime.getRuntime().totalMemory()); final int LIMIT_COUNTER = 1000000; //System.out.println("Testing Only for print..."); System.out.println("Testing for Collection inside Loop..."); //System.out.println("Testing for Collection outside Loop..."); //ArrayList<String> arr; for (int i = 0; i < LIMIT_COUNTER; ++i) { //arr = new ArrayList<String>(); ArrayList<String> arr = new ArrayList<String>(); System.out.println("" + i + ". Occupied(OldFree - currentFree): "+ (freeMemory - Runtime.getRuntime().freeMemory())); } System.out.println("Occupied At the End: "+ (freeMemory - Runtime.getRuntime().freeMemory())); System.out.println("End of Test"); } }

El resultado de la salida muestra claramente que no hay diferencia en ocupar / liberar la memoria si declara el objeto dentro o fuera del bucle. Por lo tanto, se recomienda tener la declaración tan pequeña como sea posible.
Le agradezco a todos los expertos en (especialmente @Miserable Variable) por guiarme en esto.

Espero que esto despejaría tus dudas también.