JavaRush /Blog Java /Random-ES /Ciclo de vida del objeto

Ciclo de vida del objeto

Publicado en el grupo Random-ES
¡Hola! Creo que no te sorprenderá mucho si te decimos que el tamaño de la memoria de tu computadora es limitado :) Incluso un disco duro, que es muchas veces más grande que la RAM, puede llenarse al máximo con tus juegos favoritos, series de televisión, etcétera. Para evitar que esto suceda, debe controlar el estado actual de la memoria y eliminar archivos innecesarios de su computadora. ¿Qué tiene que ver la programación Java con todo esto? ¡Directo! Después de todo, cuando la máquina Java crea cualquier objeto, se le asigna memoria. En un programa realmente grande, se crean decenas y cientos de miles de objetos, cada uno de los cuales tiene su propia memoria asignada. Ciclo de vida del objeto - 1Pero ¿cuánto tiempo crees que existen todos estos objetos? ¿“Vive” todo el tiempo que nuestro programa se ejecuta? Claro que no. Con todas las ventajas de los objetos Java, no son inmortales :) Los objetos tienen su propio ciclo de vida. Hoy tomaremos un pequeño descanso en la escritura de código y veremos este proceso :) Además, es muy importante para comprender el funcionamiento del programa y administrar los recursos. Entonces, ¿dónde comienza la vida de un objeto? Como una persona, desde su nacimiento, es decir, la creación.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего un objetoа Cat!
Primero, la máquina virtual Java asigna la cantidad de memoria necesaria para crear el objeto. Luego crea un enlace hacia él, en nuestro caso, catpara poder rastrearlo. Después de esto, se inicializan todas las variables, se llama al constructor y, he aquí, nuestro nuevo objeto ya está viviendo su propia vida :) La vida útil de los objetos es diferente, aquí no hay números exactos. En cualquier caso, durante algún tiempo vive dentro del programa y realiza sus funciones. Para ser precisos, un objeto está “vivo” mientras haya referencias a él. Tan pronto como ya no quedan enlaces, el objeto "muere". Por ejemplo:
public class Car {

   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");
       lamborghini = null;

   }

}
En el método, main()el objeto automóvil Lamborghini Diablo deja de estar vivo ya en la segunda línea. Solo había un enlace y ahora este enlace ha sido asignado null. Como no quedan referencias al Lamborghini Diablo, se convierte en “basura”. No es necesario restablecer el enlace:
public class Car {

   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");

       Car lamborghiniGallardo = new Car("Lamborghini Gallardo");
       lamborghini = lamborghiniGallardo;
   }

}
Aquí creamos un segundo objeto, después de lo cual tomamos la referencia lamborghiniy la asignamos a este nuevo objeto. Ahora Lamborghini Gallardohay dos referencias que apuntan al objeto, pero Lamborghini Diabloninguna al objeto. Por tanto el objeto Diablose convierte en basura. Y en este momento, entra en funcionamiento el mecanismo integrado de Java llamado recolector de basura, o en otras palabras, recolector de basura, GC.
Ciclo de vida del objeto - 2
El recolector de basura es un mecanismo interno de Java que se encarga de liberar memoria, es decir, eliminar de ella objetos innecesarios. No en vano elegimos una imagen con un robot aspirador para representarlo. Después de todo, el recolector de basura funciona de la misma manera: en segundo plano, "viaja" a través de su programa, recolecta basura y, al mismo tiempo, prácticamente no interactúa con él. Su trabajo es eliminar objetos que ya no se utilizan en el programa. De esta forma, libera memoria en la computadora para otros objetos. ¿Recuerdas que al principio de la conferencia dijimos que en la vida cotidiana tienes que controlar el estado de tu computadora y eliminar archivos antiguos? Entonces, en el caso de objetos Java, el recolector de basura hace esto por usted. Garbage Collector se inicia muchas veces durante el funcionamiento de su programa: no es necesario llamarlo específicamente ni darle comandos, aunque esto es técnicamente posible. Más adelante hablaremos más sobre ello y analizaremos con más detalle el proceso de su trabajo. En el momento en que el recolector de basura llega al objeto, justo antes de su destrucción, se llama a un método especial en el objeto: finalize(). Se puede utilizar para liberar algunos recursos adicionales que estaba utilizando el objeto. El método finalize()pertenece a la clase Object. Es decir, junto con equals(), hashCode()y toString(), que ya conociste antes, cualquier objeto lo tiene. Su diferencia con otros métodos es que es… cómo decirlo… muy caprichoso. Es decir, no siempre se llama antes de destruir un objeto. La programación es algo preciso. El programador le dice a la computadora que haga algo y la computadora lo hace. Probablemente ya esté acostumbrado a este comportamiento y al principio puede resultarle difícil aceptar la idea: “Antes de destruir los objetos, se llama al método finalize()de la clase Object. O no se llama. ¡Si tenemos suerte!" Sin embargo, esto es cierto. La propia máquina Java determina si llamar al método finalize()en cada caso concreto o no. Por ejemplo, intentemos ejecutar el siguiente código a modo de experimento:
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public Cat() {
   }

   public static void main(String[] args) throws Throwable {

       for (int i = 0 ; i < 1000000; i++) {

           Cat cat = new Cat();
           cat = null;//вот здесь первый un objeto становится доступен сборщику мусора
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("Объект Cat уничтожен!");
   }
}
Creamos un objeto Caty en la siguiente línea de código restablecemos la única referencia al mismo. Y así, un millón de veces. Hemos anulado explícitamente el método finalize()y debería imprimir la cadena en la consola un millón de veces, cada vez antes de destruir el objeto Cat. ¡Pero no! Para ser precisos, ¡solo se ejecutó 37.346 veces en mi computadora! Es decir, solo en 1 caso de 27 la máquina Java que instalé decidió llamar a un método finalize(); en otros casos, la recolección de basura se realizó sin esto. Intente ejecutar este código usted mismo: lo más probable es que el resultado sea diferente. Como puede ver, finalize()es difícil llamarlo un socio confiable :) Por lo tanto, un pequeño consejo para el futuro: no debe confiar en este método finalize()en el caso de liberar algunos recursos críticos. Quizás la JVM lo llame, quizás no. ¿Quién sabe? Si durante su vida su objeto ocupó algunos recursos que eran muy importantes para el rendimiento, por ejemplo, mantuvo una conexión abierta a la base de datos, es mejor crear un método especial en su clase para liberarlos y llamarlo explícitamente cuando el objeto sea ya no es necesario. De esta manera sabrás con seguridad que el rendimiento de tu programa no se verá afectado. Al principio dijimos que la gestión de la memoria y la eliminación de basura son muy importantes, y es cierto. El manejo inadecuado de los recursos y la falta de comprensión del proceso de ensamblaje de objetos innecesarios pueden provocar pérdidas de memoria. Este es uno de los errores de programación más famosos. El código escrito incorrectamente por el programador puede provocar que se asigne nueva memoria cada vez para los objetos recién creados, mientras que los objetos antiguos e innecesarios no estén disponibles para que el recolector de basura los elimine. Ya que hicimos una analogía con un robot aspirador, imagina lo que sucedería si, antes de encender el robot, esparcieras calcetines por la casa, rompieras un jarrón de vidrio y dejaras un juego de Lego desmontado en el suelo. El robot, por supuesto, intentará hacer algo, pero en un momento se quedará atascado.
Ciclo de vida del objeto - 3
Para que funcione correctamente es necesario mantener el suelo en buen estado y retirar de allí todo lo que el aspirador no pueda manipular. El recolector de basura funciona según el mismo principio. Si quedan muchos objetos en el programa que no puede recoger (como un calcetín o Lego para un robot aspirador), en un momento la memoria se agotará. Y no solo se congelará el programa que escribiste, sino también todos los demás programas que se ejecutan en la computadora en ese momento. Tampoco habrá suficiente memoria para ellos. Así es como se ven el ciclo de vida del objeto y el recolector de basura en Java. No es necesario memorizar esto: basta con comprender el principio de funcionamiento. En la próxima conferencia hablaremos sobre estos procesos con más detalle, pero por ahora puedes volver a resolver problemas de JavaRush :) ¡Buena suerte!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION