yugioh traduccion invocar funciona example español delegados como collector clean c# .net garbage-collection

c# - traduccion - garbage collector yugioh



¿Es posible crear un escenario de "isla de aislamiento" en.NET? (4)

Bueno, eso ciertamente no se filtra en .NET. Por ejemplo:

public class Foo { public Foo Bar { get; set; } } ... static void Main() { Foo f1 = new Foo(); Foo f2 = new Foo(); f1.Bar = f2; f2.Bar = f1; // Not actually required so long as nothing in the rest of the method // references f1 and f2 f1 = null; f2 = null; // The two Foo objects refer to each other, but they''re both eligible for // garbage collection. }

En un sistema ref-counted, esto daría lugar a pérdidas de memoria: en el GC .NET, no es así. Cuando el GC se ejecuta, encontrará todos los objetos accesibles desde raíces conocidas; cualquier cosa inalcanzable puede ser basura recolectada.

He estado leyendo sobre la recolección de basura y he llegado a conocer el término "Isla de aislamiento", como cuando las referencias de ObjectA a ObjectB y ObjectB hacen referencia simultáneamente a ObjectA.

¿Alguien puede darme un ejemplo de esto en C #? Además, ¿puede explicar si esto es lo mismo que una "pérdida de memoria"?


Ejemplo de: ¿ Cuándo es un objeto elegible para la recolección de basura?

class Person { public Person firend; public static void main(String[] args) { Person obj1 = new Person(); Person obj2 = new Person(); obj2.firend = obj1; obj1 = null; //Line A obj2 = null; //Line B ..... } }

Después de que se ejecuta la línea A, el objeto obj2 todavía tiene una referencia al objeto obj1 y la variable obj2 todavía hace referencia al objeto obj2. Por lo tanto, el objeto obj1 no puede ser elegible para la recolección de basura. Después de los ejecuciones de la Línea B, no hay más referencias al objeto obj2. Todavía hay una referencia al objeto obj1 dentro del objeto obj2. Ahora, el objeto obj1 y obj2 no tienen referencia del conjunto raíz de referencias. Por lo tanto, ambos objetos son elegibles para la recolección de basura.


El recolector de basura en .Net no utiliza el recuento de referencias para saber cuándo puede recoger un objeto. En su lugar, construye un gráfico de objetos donde los objetos que están actualmente accesibles (leer: en alcance o global) están en la raíz del gráfico. A continuación, utiliza el gráfico para ver si cada objeto en la memoria está conectado a la raíz; todo lo que no está conectado a la raíz se dice que está "sin raíz" y se puede recopilar. Esto es cierto incluso si otros objetos tienen referencias a un objeto sin raíz, siempre que esos objetos tampoco estén enraizados. De esta manera, esa "isla de aislamiento" de la que está hablando simplemente no es un problema.


La isla de aislamiento suele ser un problema en los GC que usan contadores de referencia. ObjectA y ObjectB en el escenario que describió para que ambos tengan un recuento de referencia de 1 y, por lo tanto, no se recopilarán aunque nada más pueda alcanzarlo .

Sin embargo, esto no ocurre en .NET porque el GC de .NET utiliza un algoritmo de marca y barrido . Comienza desde la raíz y crea un gráfico de objetos para que solo los elementos que se enraícen sobrevivan a una colección. Esto significa que nada puede ser "Aislado"