La recolección de basura es muy costosa.
De hecho, para aplicaciones complejas, el rendimiento de la recolección de basura es competitivo con gestión de almacenaje manual basado en malloc
/free
. Existe un artículo clásico por Benjamin Zorn que lo demuestra claramente. En este documento, Zorn describe cómo modificó algunas aplicaciones de gran uso intensivo de montón para utilizar un recolector de basura conservador en lugar de malloc
y free
. Luego comparó las versiones originales y modificadas de las aplicaciones. El resultado fue un rendimiento comparable.
Este artículo fue publicado en Software Practice and Experience en 1993. Si no lo ha leído, no está calificado para pronunciarse sobre la "ineficiencia" de la recolección de basura.
Tenga en cuenta que esta investigación se realizó con un 1993-vintage conservador recolector de basura. Un recolector conservador es marcado sin compactación; es decir, los objetos que no son basura no se mueven. Esto último significa que la asignación de espacio para objetos nuevos es tan lenta y complicada como malloc
. Por el contrario, los recolectores de basura modernos (por ejemplo, Java 6/7) son colectores de copias generacionales que son mucho más eficientes. Y dado que la copia compacta los objetos restantes que no son basura, la asignación es mucho más rápida. Esto hace que GC sea aún más competitivo ... si se pudiera encontrar una manera de hacer la comparación.
desarrollador no tiene control sobre GC, pero él/ella puede controlar o crear el objeto. Entonces, ¿por qué no darles la capacidad de destruir los objetos?
Depende de qué es exactamente lo que quiere decir con "destruct".
En Java, usted tiene la posibilidad de asignar null
. En algunas circunstancias, esto puede acelerar la destrucción de un objeto.
En Java, puede utilizar finalizadores y Reference
tipos para darse cuenta de que un objeto está a punto de destruirse ... y algo sobre eso.
En Java, puede definir un método close()
(o equivalente) en cualquier objeto y hacer que haga algo apropiado. Luego llámalo explícitamente.
En Java 7, tiene la construcción "intentar con recursos" para llamar automáticamente al close()
en los recursos en la salida del alcance.
Sin embargo, no puede hacer que un objeto Java se elimine AHORA. La razón por la que esto no está permitido es que permitiría a un programa crear referencias colgantes, lo que podría conducir a la corrupción del montón y bloqueos aleatorios de JVM.
Esa NO es la forma de Java. La filosofía es que escribir programas confiables es más importante que la eficiencia. Si bien ciertos aspectos de Java no siguen esto (por ejemplo, subprocesamiento), nadie quiere la posibilidad de bloqueos JVM aleatorios.
Su pregunta también tiene la respuesta. En lugar de destructor, java realiza las recolecciones de basura – Venkat
-1 para reclamos sin fundamento en la recolección de basura. – SteveD
@stevendick Aquí trato de entender solo la diferencia entre GC y Destructor. –