Aquí están los hechos:
el idioma Go tiene un recolector de basura.
Java tiene una recolección de basura
muchos programas Java tienen (sutiles o no) pérdidas de memoria
Como ejemplo de un programa Java que tiene pérdidas de memoria (no es para los débiles de corazón, la pregunta puede afectar sus creencias), vea aquí un pequeño programa Java llamado Tomcat que incluso tiene un botón para "buscar pérdidas": ¿Hay alguna manera para evitar pérdidas de memoria de anulación de implementación en Tomcat?
Entonces me pregunto: ¿los programas escritos en Go exhibirán el mismo tipo de pérdidas de memoria (sutiles o no) que exhiben algunos programas escritos en Java?
java
memory-leaks
go
Sintaxis T3rr0r
fuente
fuente
memory leak
es mejor que la tuya".Respuestas:
Estás confundiendo diferentes tipos de fugas de memoria aquí.
Las atroces fugas de memoria basadas en la gestión de memoria explícita se han ido en Java (o cualquier otro lenguaje basado en GC). Estas fugas se deben a la pérdida total de acceso a fragmentos de memoria sin marcarlos como no utilizados.
Las "fugas de memoria" todavía presentes en Java y todos los demás lenguajes del planeta hasta que la computadora pueda leer nuestras mentes todavía están con nosotros, y lo estarán en el futuro previsible. Estas fugas son causadas por el código / programador que mantiene referencias a objetos que técnicamente ya no son necesarios. Estos son errores fundamentalmente lógicos y no se pueden prevenir en ningún idioma utilizando las tecnologías actuales.
fuente
java.util.logging.Level
que contiene una estática privadaArrayList
en la que todos los objetos construidos son colocados en construcción, y de los cuales nunca se eliminan), lo que hace que sea más difícil evitarlos al programar Java que en algún otro lenguaje que no contenga tales fallasEs muy posible que los programas Go presenten pérdidas de memoria. La implementación actual de Go tiene un recolector de basura simple de marcar y barrer. Esto solo está pensado como una solución temporal y no como un recolector de basura a largo plazo. Consulte esta página para obtener más información. Mire debajo del encabezado
Go Garbage Collector
. Esa página incluso tiene un enlace para codificar la versión actual si así lo desea.fuente
Una 'pérdida de memoria' es cuando una parte de la memoria que el programador pensó que se liberaría no se libera. Esto puede suceder en cualquier idioma, recolección de basura o no. La causa habitual en los lenguajes GC es retener una referencia adicional a la memoria.
"Los lenguajes no provocan pérdidas de memoria, los programadores provocan pérdidas de memoria".
fuente
Recolección de basura o no, puede escribir un programa que tenga pérdidas de memoria en Java, Go o cualquier otro lenguaje en su mayor parte.
Garbage Collection le quita parte de la carga al programador, pero no evita las fugas por completo.
fuente
Aquí está mezclando niveles de abstracción: las pérdidas de memoria se deben a errores en la biblioteca (donde los objetos se referencian entre sí a través de cadenas de 'a mantiene referencia a b' así como una compensación en la implementación del recolector de basura entre eficiencia y precisión. ¿Cuánto tiempo desea dedicar a descubrir estos bucles? Si gasta el doble, podrá detectar bucles el doble de tiempo.
Entonces, el problema de la pérdida de memoria no es específico del lenguaje de programación, no hay ninguna razón por la que GO por sí solo deba ser mejor o peor que Java.
fuente