Pregunta

Cuando se pasa un objeto que hereda de MarshalByRefObject a un dominio de aplicación diferente, no GC.Collect () inducida por el dominio de aplicación que lo creó recoger el objeto, siempre que el objeto no tiene sus raíces en cualquiera de dominio de aplicación por el GC tiempo .Collect () se llama?

[Cuando no digo arraigado me refiero a ningún código escrito por el desarrollador de acceso más.]

Parece que el objeto no está siendo recogido sino más bien obtener un ascenso a la siguiente generación!

Pero si dejo pasar el objeto a un diff dominio de aplicación, cada vez es recogido como se esperaba.

¿Es este comportamiento por diseño? Si es así razón?

Gracias chicos,

P.S. Sé GC.Collect () en el código es malo por muchas razones, sólo estoy tratando de entender cómo GC tendría lugar el MBROs.

¿Fue útil?

Solución

Como se ha mencionado MBRO objetos son difíciles de realizar un seguimiento de la GC. Así MS implementado su comportamiento un poco diferente.
Esos objetos tienen dos propiedades: Su tiempo de vida inicial (Creo cinco minutos) y una RenewOnCallTime (dos minutos). Si se crea un objeto MBRO que tiene su tiempo de vida inicial. Una vez que este tiempo es cero se marca para GC.
Cada llamada en el objeto permite que el objeto a vivir por más tiempo RenewOnCallTime (si el tiempo de vida restante es menor que el RenewOnCallTime).

En un ejemplo (5 minutos tiempo de vida inicial, 2 minutos RenewOnCallTime):
Se crea Objeto: Tiempo de vida es de cinco minutos;
4 minutos pasan; Tiempo de vida es de un minuto;
Llamada a objeto está hecho; Tiempo de vida es de dos minutos;
2 minutos pasan;
Objeto se marca para GC, no dejó de por vida;

En algún lugar en MSDN hay un gran artículo sobre esto (que no puedo encontrar en este momento: /)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top