elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Tengo una duda con la recolección de basura (Garbage Collector)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Tengo una duda con la recolección de basura (Garbage Collector)  (Leído 2,006 veces)
DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Tengo una duda con la recolección de basura (Garbage Collector)
« en: 18 Enero 2013, 04:30 am »

Investigando por ahi, me di cuenta que Java elimina automaticamente variables primitivas (como int, long, float, etc) y de referencia, pero tambien me di cuenta que System tiene un metodo que ejecuta el recolector de basura, teniendo en cuenta eso, quise hacer un pequeño programa para ponerlo a prueba, se trata de una clase que se llama Empleado que guarda la información de un empleado, ademas de una variable static para ir contando los empleados que tiene la compañia, la cosa es que creo 2 empleados e imprimo los datos por pantalla, ademas de la cantidad de empleados y me salen que son 2, pero cuando al segundo empleado lo convierto en null y llamo al recolector de basura, no me lo borra de la memoria, y sigue marcando como 2 empleados en la compañia en vez de 1, ¿alguien sabe a que se debe esto?, ¿ que no se suponia que el recolector borra de la memoria las variables que son "inutiles"?

Les dejo el codigo

//Clase Empleado

package ejercicio83;

public class Empleado {
    
    private String nombre;
    private String rut;
    private int edad;
    private int sueldo;
    private static int cantEmpleados = 0;
    
    public Empleado(String nombre, String rut, int edad, int sueldo){
        
        this.nombre = nombre;
        this.rut = rut;
        this.edad = edad;
        this.sueldo = sueldo;
        this.cantEmpleados++;
        
    }
    
    public String getNombre(){
        
        return nombre;
        
    }
    
    public String getRut(){
        
        return rut;
        
    }
    
    public int getEdad(){
        
        return edad;
        
    }
    
    public int getSueldo(){
        
        return sueldo;
        
    }
    
    public static int getContratados(){
        
        return cantEmpleados;
        
    }
    
}


//Main

package ejercicio83;

public class Ejercicio83 {

    public static void main(String[] args) {
       
        Empleado empleado1 = new Empleado("Juan", "1234", 22 , 350000);
        Empleado empleado2 = new Empleado("Carlos", "5678", 30, 1200000);
       
        System.out.printf("\n\nNombre: %s\nRut: %s\nEdad: %d\nSueldo: %d", empleado1.getNombre(), empleado1.getRut(), empleado1.getEdad(), empleado1.getSueldo());
        System.out.printf("\n\nNombre: %s\nRut: %s\nEdad: %d\nSueldo: %d", empleado2.getNombre(), empleado2.getRut(), empleado2.getEdad(), empleado2.getSueldo());
       
        empleado2 = null;
        System.gc();
        System.out.printf("\n\n%d empleados\n", Empleado.getContratados());
       
    }
}



En línea

Nasty35

Desconectado Desconectado

Mensajes: 77


Ver Perfil
Re: Tengo una duda con la recolección de basura (Garbage Collector)
« Respuesta #1 en: 18 Enero 2013, 16:38 pm »

Primero, si la variable es estática no la puedes llamar como this.
Y te pasa porque borras una variable que contiene un objeto de la clase, pero como el valor cantEmpleados es estático, no puedes borrarlo de esa forma, tienes que hacer un algoritmo para que detecte cuando se valla un empleado y lo reste (cantEmpleados--), no sé si me entiendes... si es estático siempre es el mismo, y no lo puedes manejar individualmente por cada objeto de la clase.
pd: Si lo igualas a null, creo que automáticamente se recicla, y no hace falta llamar al GC.


En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: Tengo una duda con la recolección de basura (Garbage Collector)
« Respuesta #2 en: 20 Enero 2013, 19:40 pm »

Hola , primero que nada debes tener claro que nada garantiza que el Garbage Collector se ejecute cuando tu le llamas a  System.gc();, con lo cual basta con que simplemente pongas la variable a null y listo.

Segundo, como quieres que el GC sepa que al eliminar el objeto debe restarlo del contador de tu clase, el GC no sabe que tu estas contando referencias .... lo que has de hacer es usar el método finalize, que es llamado antes de destruir un objeto , allí es donde agregarás el código que resta a tu contador. He modificado tu código con lo que te comento , ejecutalo y verás ...


Código
  1.  
  2.  
  3. class Empleado {
  4.  
  5.    private String nombre;
  6.    private String rut;
  7.    private int edad;
  8.    private int sueldo;
  9.    private static int cantEmpleados = 0;
  10.  
  11.    public Empleado(String nombre, String rut, int edad, int sueldo){
  12.  
  13.        this.nombre = nombre;
  14.        this.rut = rut;
  15.        this.edad = edad;
  16.        this.sueldo = sueldo;
  17.        Empleado.cantEmpleados++;
  18.  
  19.    }
  20.  
  21.    public String getNombre(){
  22.  
  23.        return nombre;
  24.  
  25.    }
  26.  
  27.    public String getRut(){
  28.  
  29.        return rut;
  30.  
  31.    }
  32.  
  33.    public int getEdad(){
  34.  
  35.        return edad;
  36.  
  37.    }
  38.  
  39.    public int getSueldo(){
  40.  
  41.        return sueldo;
  42.  
  43.    }
  44.  
  45.    public static int getContratados(){
  46.  
  47.        return cantEmpleados;
  48.  
  49.    }
  50.    //resta uno al contador de objetos
  51.    protected void finalize(){
  52. Empleado.cantEmpleados--;
  53.    }
  54.  
  55. }
  56.  
  57.  
  58.  
  59.  
  60. public class Ejercicio83 {
  61.  
  62.    public static void main(String[] args) {
  63.  
  64.        Empleado empleado1 = new Empleado("Juan", "1234", 22 , 350000);
  65.        Empleado empleado2 = new Empleado("Carlos", "5678", 30, 1200000);
  66.  
  67.        System.out.printf("\n\nNombre: %s\nRut: %s\nEdad: %d\nSueldo: %d", empleado1.getNombre(), empleado1.getRut(), empleado1.getEdad(), empleado1.getSueldo());
  68.        System.out.printf("\n\nNombre: %s\nRut: %s\nEdad: %d\nSueldo: %d", empleado2.getNombre(), empleado2.getRut(), empleado2.getEdad(), empleado2.getSueldo());
  69.  
  70.        empleado2 = null;
  71. boolean objetoEliminado = false;
  72. while(!objetoEliminado){
  73. if(Empleado.getContratados() == 1){
  74. objetoEliminado = true;
  75. }
  76. }
  77.        System.out.printf("\n\n%d empleados\n", Empleado.getContratados());
  78.  
  79.    }
  80. }
  81.  

Espero haber sido claro.

Saludos
En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Metasploit email collector
Hacking
Bhior 1 2,855 Último mensaje 29 Mayo 2010, 23:06 pm
por Søra
Apple corrige la recolección de datos de geolocalización en sus móviles
Noticias
wolfbcn 0 1,405 Último mensaje 6 Mayo 2011, 01:47 am
por wolfbcn
Consulta sobre Timer y Garbage Collector
Java
zonahurbana 0 2,084 Último mensaje 2 Agosto 2013, 23:53 pm
por zonahurbana
EE.UU.: El Senado entierra proyecto que pretendía poner fin a recolección ...
Noticias
wolfbcn 5 2,119 Último mensaje 25 Mayo 2015, 03:35 am
por Gh057
Pentest: recolección de información (information gathering)
Seguridad
JUCA 0 2,457 Último mensaje 5 Octubre 2016, 15:26 pm
por JUCA
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines