tuve algunos consejos que suena muy mal recientemente de un "alto" desarrollador/compañero de trabajo en relación con el recolector de basura de C# como ...¿Cuáles son las diferencias fundamentales entre la recolección de basura en C# y Java?
"Es necesario utilizar destructores todas partes en C# porque el recolector de basura no se puede confiar en eso ".
"El recolector de basura C# no puede ser pensado como el recolector de Java ".
Esto suena muy sospechoso para mí, por lo que yo sé las diferencias entre el C# y recolectores de basura de Java son los siguientes ...
- El C# es un generacional basura colector, Java es marca concurrente barrer en 1.6 con G1 como el nuevo colector de basura predeterminado (generacional) con Java 7 y como opcional desde ~ 1.6.21. Hasta ahora como sé
- C# como un lenguaje tiene la capacidad de disponer manualmente de los objetos que implementar
IDisposable
. Java debe utilizar siempre la recolección de elementos no utilizados, aunque algunos marcos como SWT requieren que invoque manualmente los métodos a la memoria de liberación en el código nativo subyacente .
que se dan cuenta de que Java y C# son sólo los idiomas y los recolectores de basura son un componente de tiempo de ejecución, sin embargo, para este caso estoy hablando específicamente sobre el Sol/Oracle JVM y Microsoft .NET Runtime.
¿Alguien tiene comentarios?
Su compañero de trabajo está completamente equivocado sobre los destructores. Citando las Pautas de diseño de marco de Microsoft: "Realmente no desea escribir un finalizador si puede evitarlo". – TrueWill
Me temo que su compañero de trabajo está muy equivocado. Un finalizador ni siquiera es realmente un destructor, no es una forma de desasignar manualmente una instancia de objeto gestionado. De hecho, si tiene un finalizador, es llamado por el recolector de basura. Existen finalizadores para que pueda limpiar la memoria no administrada, como si hiciera una llamada de WinAPI y obtuviera un control. El GC no puede recolectar la memoria no administrada como manejadores, podría usar un finalizador para eso (aunque con .Net 2.0 y arriba, probablemente irías con un SafeHandle en su lugar). – JMarsch
Tengo que estar en desacuerdo sobre que GC no sea confiable. Hemos estado desarrollando con .Net desde 2001, incluidas aplicaciones web y algunos servicios de Windows (los servicios de Windows pueden ejecutarse durante meses y, por lo general, solo se reinician cuando una Actualización de Windows requiere un reinicio). las únicas "filtraciones" que he visto caen en 2 cubos: la mayoría de los casos donde guardamos una referencia (un error en nuestro código) y algunos casos en que nuestro código llamaba a código no administrado (antiguo C++ DLL o Winapi, etc.), y hubo una fuga en el código no administrado (el GC no puede ayudarlo con la memoria no administrada) – JMarsch