Estoy jugando un poco con Java, pero tengo mucha experiencia en otros idiomas. Tengo un problema de prueba para el que conozco la solución (y puedo producirlo fácilmente en Python y C++). Pero ejecutar el siguiente código Java da una
Excepción en el subproceso "principal" java.lang.OutOfMemoryError: espacio de almacenamiento dinámico de Java
Me pregunto si estoy cometiendo un simple error, no esperaría que la huella de memoria de este programa fuera muy grande:
public static void main(String[] args) { ArrayList<Integer> longest_sequence = new ArrayList<>(); ArrayList<Integer> this_sequence; int n = 0; for (int i = 1; i < 1000000; i++) { this_sequence = new ArrayList<Integer>(); n = i; this_sequence.add(n); while (n != 1) { if (n % 2 == 0) { n = n / 2; } else { n = 3*n + 1; } this_sequence.add(n); } if (this_sequence.size() > longest_sequence.size()) { longest_sequence = this_sequence; } } System.out.println(longest_sequence.get(0)); System.out.println(longest_sequence.size()); }Para aclarar un poco más:
Se crea una nueva lista en cada iteración del programa. Se conserva asignándole la secuencia más larga o se descarta y se sobrescribe con una nueva instancia de lista.
¿Supongo que mis suposiciones sobre eso son incorrectas y las instancias se están preservando? El tamaño de las listas no debería ser un problema (alrededor de 500 elementos para la más grande).
Fallará incluso si aumenta su espacio de almacenamiento dinámico.
Para n = 113383, una operación lo hace pasar por el límite de enteros y n se vuelve negativo y esto termina en un bucle infinito.
Funciona si cambia Integer por Long.
Creo que lo más fácil de evitar esto es agregar memoria usando el indicador -Xmx
https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html aquí hay documentos oficiales para leer más al respecto
para cambiar la VM para Eclipse, puede cambiar la cantidad de MV desde Windows> Preferencias> Java> JRE instalados desde allí, seleccione el JRE y haga clic en editar, luego escriba los Argumentos de VM predeterminados: a -Xmx1024M o cualquier otra cantidad de memoria. ..
Bueno, se explica por sí mismo: te has quedado sin memoria.
Es posible que desee intentar iniciarlo con más memoria, utilizando el indicador -Xmx, por ejemplo
java -Xmx2048m [lo que haya escrito antes] Esto usará hasta 2 gigas de memoria.
Consulte la lista de opciones no estándar para obtener más detalles.