Implementé un recolector de basura de Java una vez, así que todo lo que pude lograr es un límite (débil :) más bajo en lo que es posible.
En mi implementación, hay una pequeña cantidad constante de sobrecarga adicional para cada referencia débil cuando se visita durante la recolección de basura.
Así que el resultado es: No me preocuparía, no es un gran problema a menos que esté usando billones de referencias débiles.
Lo que es más importante, el costo es proporcional al número de referencias débiles existentes, no al tamaño del montón global.
Sin embargo, eso no quiere decir que un recolector de basura que admita referencias débiles sea tan rápido como uno que no lo haga. La pregunta que se presume aquí es que, dado que Java admite referencias débiles, ¿cuál es el costo incremental de usarlas?
La mina era un simple "parar el mundo" marca/barre el recolector de basura.Durante la recolección de basura, realiza una determinación para cada objeto, ya sea que ese objeto esté vivo o no, y establece un bit LIVE
en el encabezado del objeto. Luego pasa y libera todos los objetos no vivos.
Para manejar referencias débiles que acaba de añadir lo siguiente:
- Ignorar referencias débiles al establecer
LIVE
bits (es decir, que no causan el bit LIVE
en el objeto referenciado a ajustar).
- Durante el paso de barrido, agregue un control especial de la siguiente manera: si el objeto que está visitando es
LIVE
, y es WeakReference
, luego verifique el objeto al que hace referencia débilmente, y si ese objeto no es LIVE
, borre la referencia .
Pequeñas variaciones de esta lógica funcionan para referencias blandos y fantasmas.
Implementación es here si eres realmente curioso.
Obviamente, esto dependerá de la implementación de JDK, Sun vs IBM contra JRockit, etc. –
Inicio de una respuesta en un artículo de [Goetz] (http://www.ibm.com/developerworks/java/library/j- jtp01246/index.html): * En cada recolección de elementos no utilizados, se debe construir una lista de objetos de referencia activos, y cada referencia debe procesarse adecuadamente, lo que agrega cierta sobrecarga por referencia a cada colección independientemente de si el referente se recopila en ese momento. Los propios objetos de referencia están sujetos a la recolección de basura y pueden recopilarse antes que el referente, en cuyo caso no se ponen en cola. * – assylias