TODOPIC
Misceláneas - Interés General => Off Topic => Mensaje iniciado por: micro_pepe en 28 de Mayo de 2013, 19:52:12
-
Me surge una duda sobre los arrays en Java, si yo tengo definido un array de la siguiente forma:
int[] n_filas = new int[tabla.length];
donde el tamaño del array está definido por el numero de filas de una tabla. Ese codigo se ejecuta cada vez que pulso un botón que actualiza la tabla, y esta puede tener mas o menos filas.
¿Que ocurre internamente? es decir, si una vez tiene un tamaño de 10, y la siguiente vez que paso por ese codigo el tamaño es de 4, ¿se liberan 6 posiciones del array en memoria?
Saludos!
-
Java posee Garbage Collector.
Hay que tener presente que cada vez que aparece un new, se estará creando un objeto que ocupa lugar en memoria.
Cuando se ejecuta esa línea, Java reserva memoria y guarda el puntero al objeto en n_filas. Para que esa memoria se libere mediante el Garbage Collector, no tiene que existir referencia en uso al objeto. Si siguese existiendo por algun motivo al menos una, Java no libera la memoria y continúa reservando memoria en cada pasada por la línea mencionada. Eso lleva a los famosos desbordamientos de memoria.
Saludos.
-
Bien, gracias por la respuesta Bruno.
Esa variable la uso localmente en un evento de un botón, y luego al final de ese evento la paso por parametro a un JDialog, este hace uso de ella.
Entonces para que se libere la memoria, si al salir del JDialog pongo un n_filas=null; (en el JDialog llamé igual la variable) y también lo pongo en el evento justo antes de hacer el new listo, ¿no? (logicamente en la clase del evento tengo que definir un array global: int[] n_filas; y en evento hacer el n_filas=null; seguido de n_filas=new).
Saludos!
-
En objetos sencillos, no anidados como este, hacer null la variable basta para asegurarse que el Garbage Collector se hará cargo de ella. No sucede lo mísmo en objetos de, por ejemplo, tipo árbol donde por más que hagas null la raíz del árbol, pueden seguir existiendo referencias a algunas ramas del mísmo, y por ende el Garbage Collector no descargará el árbol completo, sólo aquello que ha quedado sin referencia.
Si existe una parte o un todo de un objeto con al menos una referencia alcanzable por el usuario, entonces el objeto no será procesado por el Garbage Collector y persistirá en la memoria. Caso contrario la memoriia ocupada por dicho objeto será liberada en la próxima pasada del Garbage Collector.
saludos.