Cuando la palabra clave new se usa en Java, se asigna memoria, pero aquí estoy confundido:

Foo f1 = new Foo(); //consumes memory m1
Foo f2 = new Foo(); //consumes memory m2
f2=f1; //Now, f2 just points to f1, so what about the memory m2

¿La memoria m2 solo espera el GC, ya que los contenidos no se copian, tanto f2 como f1 apuntan a lo mismo ahora m1 o m2? ¿Esto causa memoria no utilizada hasta que el GC hace lo suyo?

Cualquier explicación o opinión sobre esto es bienvenida.

1
Hiresh 22 ene. 2018 a las 15:38

3 respuestas

La mejor respuesta

El objeto al que hace referencia previamente f2 es inalcanzable y esperará en la memoria hasta que el GC pueda manejarlo.

Ahora teóricamente sería posible tener nuevos objetos creados en ese espacio, ya que ya no se usa. Sin embargo, no conozco ningún algoritmo de GC que haga este tipo de "intercambio en caliente", y probablemente sea ineficiente. El algoritmo se volvería más complejo y la ventaja en el uso de la memoria sería mínima. Todavía requeriría la fase de "marca" para identificar los objetos que esperan la colección.

3
Kayaman 22 ene. 2018 a las 12:57

Como usted preguntó:

En Java y otros idiomas con recolectores de basura, la biblioteca de soporte de idiomas recuperará la memoria y la pondrá a disposición para su reutilización.

En general: en C ++ / C y en lenguajes que normalmente no tienen recolectores de basura, la memoria se pierde y el proceso nunca puede recuperarla.

0
user3344003 22 ene. 2018 a las 15:51

Estás en lo correcto. El objeto original al que se refería f2 todavía estará en el montón hasta que GC lo recoja (recupere la memoria ocupada por él). Entonces, f2 haría referencia al mismo objeto que f1.

2
Dheeru Mundluru 22 ene. 2018 a las 12:49
48381815