Supongamos que tengo una referencia débil a un automóvil que tiene una referencia ordinaria (fuerte) a un motor. No hay otras referencias al automóvil o al motor. ¿Puede el motor ser basura recolectada?referencia débil al objeto que contiene una referencia fuerte anidada, y recolección de basura
Respuesta
Sí, puede, así es exactamente como weak references están diseñados para funcionar. La referencia débil es la raíz que tiene su objeto para la aplicación, aunque el objeto puede tener otras referencias fuertes es la referencia root que importa y dado que la referencia raíz es una referencia débil, el objeto será un candidato para la recolección de basura .
Para obtener más información, véase la documentación WeakReference
clase:
objetos débiles de referencia, que no evitar que sus referentes de ser hecho finalizables, finalizada, y luego recuperados. Las referencias débiles son las más que se utilizan a menudo para implementar las correlaciones de canonización .
Supongamos que el recolector de basura determina en un cierto momento en el tiempo que un objeto es débilmente alcanzable. En que tiempo que atómicamente claro todas referencias débiles a ese objeto y todos los referencias débiles a cualquier otro objetos débilmente alcanzable desde el que ese objeto es accesible a través de una cadena de fuertes y suaves referencias . Al mismo tiempo, declarará finalizables todos los objetos de acceso débil como finalizables. Al mismo tiempo, o al , algún tiempo posterior pondrá en cola esas referencias débiles recientemente despejadas que están registradas con colas de referencia.
FYI, junto con WeakReference
, Java ofrece otras dos subclases de Reference
: SoftReference
y PhantomReference
.
Aquí hay una prueba de unidad que demuestra las referencias débiles. Tenga en cuenta que System.gc() no garantizará que el objeto recibirá basura recolectada y no debe confiar en él.
import junit.framework.TestCase;
import java.lang.ref.WeakReference;
public class WeakReferenceTest extends TestCase {
class Car {
Engine engine = new Engine();
}
class Engine {
}
public void testWeakReferences() {
WeakReference<Car> carRef = new WeakReference<Car>(new Car());
assertNotNull(carRef.get());
System.gc();
assertNull(carRef.get());
}
}
¿Qué significa exactamente la notación WeakReference
Esa llamada a System.gc() no garantiza que la última declaración sea verdadera. – Phil
Es una parametrización de la clase genérica 'WeakReference
La instancia de coches podría ser el recolector de basura, pero no hay ninguna garantía de que se ser basura recogida en el siguiente ciclo de GC, o incluso que se recogerá en absoluto. Por ejemplo,
En algún momento antes de las carreras de GC, la aplicación podría llamar
get
en elWeakReference
y guardar la referencia a laCar
en (por ejemplo) un atributo de un objeto accesible. La instanciaCar
se vuelve completamente accesible y ya no es elegible para la recolección de elementos no utilizados.Si el GC se ejecuta con el
Car
en el estado descrito, la especificación de JVM no garantiza que se detecte lo débilmente alcanzable en el próximo ciclo de GC.Por ejemplo, si un ciclo de GC dado solo recopila la última generación (y elCar
se ha promovido a una generación anterior), el GC no determinará que es débilmente alcanzable.Incluso cuando el GC rompe la referencia al
Car
en WeakReference, la instanciaCar
no se recupera inmediatamente. Por el contrario, la recuperación de la ahora inalcanzableCar
probablemente suceda (después de una posible finalización) en un ciclo GC posterior.
- 1. Referencia débil y Referencia fuerte
- 2. Crear una referencia débil a un objeto
- 3. En Perl, ¿por qué copiar una referencia débil crea una referencia normal y fuerte?
- 4. referencia interna impide la recolección de basura
- 5. Referencia fuerte de Android
- 6. ¿La referencia a un delegado constituye una referencia a un objeto (para evitar la recolección de basura)?
- 7. "Referencia débil": explicación realista
- 8. cómo hacer referencia al objeto que contiene ("este") usando attachEvent
- 9. C#: Crear una referencia fuerte entre los objetos, sin que uno haga referencia al otro
- 10. ¿Qué es una "referencia de marco débil"?
- 11. C# - puede hacer una referencia de ensamblado "débil" a un ensamblado con nombre fuerte
- 12. Eventos en ViewModel con System.Windows.Interactivity.EventTrigger, ¿es una referencia débil?
- 13. y recolección de basura
- 14. Objeto débil en un NSDictionary?
- 15. Declarando una referencia al objeto y al operador de asignación
- 16. ¿Cómo eliminar una referencia débil de una lista?
- 17. Recolección de basura
- 18. multiprocesamiento y recolección de basura
- 19. ¿Por qué .NET no tiene una referencia suave sino también una referencia débil, como Java?
- 20. colector de basura y la referencia circular
- 21. Recopilador de basura al analizar referencias débiles
- 22. Uso de la recolección de basura?
- 23. Recolección de basura del objeto creado en el bucle infinito
- 24. débil o fuerte para IBOutlet y otros
- 25. Ruby Class objeto recolección de basura
- 26. Crear referencia al nuevo objeto
- 27. Python: cómo comprobar si aún hay disponible una referencia débil
- 28. ¿NewLISP usa la recolección de basura?
- 29. Estructura que contiene tipos de referencia
- 30. referencia débil en el código JavaScript de Firefox cromo
Nunca he escuchado la expresión referencia débil y parece que implica algún mecanismo. Si entiendo las cosas correctamente, la pregunta es si el motor será basura recolectada si nada hace referencia al automóvil. –
@James P .: WeakReference es una clase en la API estándar de Java que proporciona un mecanismo especial, es decir, referencias que no impiden que un objeto sea elegible para la recolección de basura. –