Esta es una pregunta muy molesta, y creo que contribuye a que muchos se opongan a Java a pesar de lo útil que es un lenguaje.
El hecho de que no pueda confiar en "System.gc" para hacer cualquier cosa es increíblemente desalentador y puede invocar fácilmente la sensación de "Miedo, incertidumbre, duda" al lenguaje.
En muchos casos, es bueno lidiar con los picos de memoria que causa a propósito antes de que ocurra un evento importante, lo que haría que los usuarios piensen que su programa está mal diseñado / no responde.
Tener la capacidad de controlar la recolección de basura sería una gran herramienta educativa, que a su vez mejoraría la comprensión de las personas sobre cómo funciona la recolección de basura y cómo hacer que los programas exploten su comportamiento predeterminado y su comportamiento controlado.
Permítanme revisar los argumentos de este hilo.
- Es ineficiente:
A menudo, el programa puede no estar haciendo nada y usted sabe que no está haciendo nada debido a la forma en que fue diseñado. Por ejemplo, podría estar haciendo una especie de larga espera con un gran cuadro de mensaje de espera, y al final también podría agregar una llamada para recolectar basura porque el tiempo de ejecución tomará una fracción muy pequeña del tiempo del espere mucho pero evitará que gc actúe en medio de una operación más importante.
- Siempre es una mala práctica e indica código roto.
No estoy de acuerdo, no importa qué recolector de basura tenga. Su trabajo es rastrear la basura y limpiarla.
Al llamar al gc durante los momentos en que el uso es menos crítico, reduce las probabilidades de que se ejecute cuando su vida se basa en el código específico que se ejecuta, pero en su lugar decide recolectar basura.
Claro, puede que no se comporte de la manera que desea o espera, pero cuando desea llamarlo, sabe que no está sucediendo nada y el usuario está dispuesto a tolerar la lentitud / tiempo de inactividad. Si el System.gc funciona, ¡genial! Si no es así, al menos lo intentaste. Simplemente no hay inconveniente a menos que el recolector de basura tenga efectos secundarios inherentes que hacen algo horriblemente inesperado en cuanto a cómo se supone que debe comportarse un recolector de basura si se invoca manualmente, y esto por sí mismo causa desconfianza.
- No es un caso de uso común:
Es un caso de uso que no puede lograrse de manera confiable, pero podría serlo si el sistema fue diseñado de esa manera. Es como hacer un semáforo y hacer que algunos / todos los botones de los semáforos no hagan nada, te hace preguntarte por qué el botón está ahí para empezar, javascript no tiene la función de recolección de basura, por lo que no No lo analice tanto por eso.
- La especificación dice que System.gc () es una pista de que GC debe ejecutarse y la VM es libre de ignorarlo.
¿Qué es una "pista"? ¿Qué es "ignorar"? una computadora no puede simplemente tomar pistas o ignorar algo, hay caminos de comportamiento estrictos que pueden ser dinámicos y guiados por la intención del sistema. Una respuesta adecuada incluiría lo que el recolector de basura realmente está haciendo, a nivel de implementación, que hace que no realice la recolección cuando lo solicita. ¿Es la función simplemente un nop? ¿Hay algún tipo de condiciones que deba cumplir? ¿Cuáles son estas condiciones?
Tal como está, el GC de Java a menudo parece un monstruo en el que simplemente no confías. No sabes cuándo va a ir o venir, no sabes qué va a hacer, cómo va a hacerlo. Me imagino que algunos expertos tienen una mejor idea de cómo funciona su Recolección de Basura por instrucción, pero la gran mayoría simplemente espera que "simplemente funcione", y tener que confiar en un algoritmo aparentemente opaco para que funcione para usted es frustrante.
Existe una gran brecha entre leer acerca de algo o aprender algo, y realmente ver su implementación, las diferencias entre sistemas y poder jugar con él sin tener que mirar el código fuente. Esto crea confianza y sentimiento de dominio / comprensión / control.
Para resumir, hay un problema inherente con las respuestas "esta característica podría no hacer nada, y no entraré en detalles sobre cómo saber cuándo hace algo y cuándo no hace y por qué no lo hará o lo hará, a menudo implica que es simplemente contra la filosofía intentar hacerlo, incluso si la intención detrás de esto es razonable ".
Puede estar bien que Java GC se comporte de la manera en que lo hace, o puede que no, pero para entenderlo, es difícil seguir realmente en qué dirección ir para obtener una visión general completa de lo que puede confiar en el GC y no hacer, por lo que es demasiado fácil simplemente desconfiar del lenguaje, porque el propósito de un lenguaje es tener un comportamiento controlado hasta un punto filosófico (es fácil para un programador, especialmente los novatos caer en una crisis existencial debido a ciertos comportamientos del sistema / lenguaje) son capaces de tolerar (y si no puedes, simplemente no usarás el lenguaje hasta que tengas que hacerlo), y más cosas que no puedes controlar sin razón conocida por la que no puedes controlarlas son inherentemente dañinas.