Antes que nada gracias por el debate, me esta aclarando un poco mas sobre el
GC.
Particularmente yo trato de no ejecutar el GC.Collect porque había leído que
no era recomendable.
 
Con respecto al uso del procesador que opinan ?
Hay alguna manera de decir que cierto proceso puede usar hasta un máximo del
procesador o que tiene menor prioridad a otros procesos (Para que no afecte
la performance del servidor) ?
 
Daniel, mencionaste algo de dormir el proceso.
Podes explicarme un poco en que consiste ?
 
 

-----Mensaje original-----
De: Damián Herrera [mailto:[EMAIL PROTECTED]
Enviado el: Jueves, 11 de Octubre de 2007 14:11
Para: [email protected]
Asunto: [puntonet] Preguntas varias


Hola Pablo,
 
Según lo que yo lei el tema de las generaciones se aplica a partir de la
cantidad de veces que el GC evaluó si eliminaba el objeto o no (fuera de
scope o referencia nula). No tiene que ver en este sentido con el tamaño del
objeto en memoria.
 
Hasta donde se, la política que aplica GC es "cuanto más antiguo es el
objeto más probable es que permanezca en memoria" por eso asigna
generaciones. Entonces siempre el primer paso del GC es hacer el árbol de
recolección de objetos y marcar a quienes va a liberar, liberar los que ya
están marcados para liberar e incrementar las generaciones de los gen0. Si
requiere liberar más memoria recorre el árbol de gen1, y si requiere más el
gen2.
 
Después hay un segundo proceso que es la compactación de memoria que evita
la fragmentación.
 
Espero haber ayudado :s
 
Saludos,
Damián Herrera


   _____  

From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Pablo A.
Allois
Sent: Thursday, October 11, 2007 1:26 PM
To: [email protected]
Subject: [puntonet] Preguntas varias


Sobre el GC.en FX1.1, si mi memoria no me falla es algo asi:
 
Gen0: objetos que ocupan poco espacio creados mas recientemente
         Politica: limpiar seguido los objetos. Consume pocos recursos.
        
Gen1: objetos de la Gen0 que intento limpiar una vez y estaban referenciados

          Politica: no limpia tan seguido como la gen0. . Consume pocos
recursos.
 
Gen3: objetos que ocupan mas espacio en memoria
         Politica: los limpia cuando lo cree indispensable ... por ejemplo
cuando necesita memoria
                      Consume muchos recursos.
 
Algo mas, hay que investigar si no hay lagunas de memorias ... se que hay
una combinacion de contadores de performance que te permite averiguarlo.
 
Un buen punto tambien, para comenzar a investigar el consumo de memoria, es
levantar los contadores de performance del Garbage Collector ... inclusive
te perite monitorear el GC por generacion.
 
 
Saludos!

   _____  

De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Daniel
Calvin
Enviado el: Jueves, 11 de Octubre de 2007 12:13 p.m.
Para: [email protected]
Asunto: [puntonet] Preguntas varias


Hola Pablo

vamos a darle un contexto a lo que dije:


>>>Dim myDS=zzz.Traer () as DataSet


myDS es una referencia al data set retornado por la funcion, la erewspuesta
que di es por la duda de como se des referencia la variable interna de la
función.

Lo que trate de graficar es que esa referencia solo queda asociada a la
variable receptora. Si myDS sale de ambito y coando lo sabe el que esta
programando. 
Lo mjio fue para graficar donde limpiarias la referencia si necesitas
hacerlo.

>>>>

- Sobre " GC no recolecta objetos costosos, mantiene las referencias de esos
objetos por mas tiempo"
Los limpia, pero cuando quiere o lo necesita.

El GC mantiene dos tablas de referencias, por decirlo e alguna manera, para
liberar determinados objetos hace alguna evaluacion de costo, si esa
evaluacion da como rsulatdo un alto costo GC no recolecta, pasa ese objeto a
la segunda lista de referencias. Solo lo liberará ante una necesidad
importante de recursos. Esto es asi en Net 2.0, no es el comportamiento de
Net 1.1 y anteriores. Tengo un paper en algun lugar, lo busco y lo mando a
la lista. Pero es asi, el GC no siempre te libera todo.

Saludos

Daniel Calvin



El día 11/10/07, Pablo A. Allois < [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> > escribió: 

Ante todo disculpa Daniel ... pero no coincido del todo.
 
- Sobre ds = nothing
El GC marca los objetos para limpiarlos en la medida que no tengan
referencias, por lo tanto haceralgo = nothing, la mayoria de las veces es
innecesario.
Si tengo una variable dentro de un metodo, apuntando al dataset ... cuando
salgo del scope del metodo no me quedan referencias apuntando al dataset y
esta listo para el GC; en todo caso, seria util, si el dataset esta apuntado
desde alguna referencia static/shared.
Personalmente, mas alla de que pueda ayudar el ds = nothing, no creo que la
ayuda al GC justifique esa linea de codigo.
 
- Sobre Dispose
Coincido 
 
- Sobre Dataset.Dispose
Si, al dataset no lo usas desde el diseniador, y no te colgas de los eventos
... ejecutarlo hoy ... al menos con el FX1.1 no te brinda nada.
Si lo decompilas, se ve que el Dispose esta escrito en la clase
MarshallByValueObject ... y lo unico que hace, es limpieza de handlers y
objetos del diseniador.
 
- Sobre "GC no recolecta objetos costosos, mantiene las referencias de esos
objetos por mas tiempo"
Los limpia, pero cuando quiere o lo necesita.
 




 


 



 


Saludos!
 
 De: [email protected] <mailto:[email protected]>  [mailto:
[email protected] <mailto:[email protected]> ] En nombre de Daniel
Calvin   
Enviado el: Jueves, 11 de Octubre de 2007 10:59 a.m.
Para: [email protected] <mailto:[email protected]> 
Asunto: [puntonet] Preguntas varias



Hola Diego

1 - Hacer dispose es una cosa hacer algo = nothing es otra.

Cuando las clase implementan IDisposable es porque tienen capturados
recursos que se deberian liberar.
el invocar el dispose() hace eso, el que programo la clase en ese metodo
libera todos los recursos capturados. 

El tema del nothing pasa por otro lado. Tiene que ver con mantener
referencias no utilizadas a objetos.
Se recomienda hacer xx = nothing para que el GC pueda recolectar el objeto.

En cuanto a como actua el GC tiene algunas particularidades. GC no recolecta
objetos costosos, mantiene las referencias de esos objetos por mas tiempo.
La recoleccion de objetos no es predecible, solo sabemos que no debe haber
referencias a un objeto para que si el GC en base a sus politicas de
recoleccion necesita liberar la memoria lo haga. 

Si una clase implementa IDisposable eso no significa que el GC la libere con
mayor celeridad.

En el caso que planteas:
        Function traer() as dataset
        Dim ds as new dataset

        ds = CargarDatasetdesdeSQL 

        return ds
        end function
Tu funcion retorna una referencia a ds, el nothing lo haras en el consumidor
de Traer() luego de haber terminado de usar el dataset, algo asi:

Dim myDS=zzz.Traer () as DataSet
( o algo parecido, programo en vb   :(   )

luego tu proceso:
    ....
    ....
    ....

Luego:
    myDS=nothing

2 - La solución puede ser lanzar el proceso en un nuevo thread, y dormir el
mismo un tiempo x dentro de la iteración. 

Saludos

Daniel Calvin





El día 11/10/07, JATEMLIANSKY, Diego <  <mailto:[EMAIL PROTECTED]>
[EMAIL PROTECTED] > escribió: 


Gente como andan ?
Tengo un par de preguntas para hacerles que nos están sacando el sueño y que

tal vez con algunos tips que nos puedan dar nos puedan orientar un poco como
encararlo.

La arquitectura que tenemos es de FrontEnd en ASP.NET <http://ASP.NET> ,
BackEnd en Servicios
de Windows VB.NET <http://VB.NET>  accedidos por Remoting y SQL Server.
(Todo esto instalado en servidores, no instalamos nada en las PC clientes)

Ahora les paso las preguntas (Todas con respecto a la parte del BackEnd en 
donde tenemos todas las reglas de negocios y el grueso de la codificacion):

1- Liberar memoria:
        En algunos casos nos esta costando entender como hacer para liberar
memoria.
        Por un lado encontramos que nos recomiendan hacer los Dispose de los

DataSets una vez utilizados y por otro lado también encontramos algunos
sites que recomiendan hacer un ds = nothing para liberar la memoria, cual es
la opción mas recomendable?

        Por otro lado, que pasa si un método de nuestro BackEnd hace 
solamente lo siguiente:

        Function traer() as dataset
        Dim ds as new dataset

        ds = CargarDatasetdesdeSQL

        return ds
        end function

        Como hacemos para liberar la memoria utilizada por este DataSet (que

en algunos casos trae muchos datos para mostrar en pantalla) si después del
return no podemos hacer mas nada.

2- Prioridad de procesos:
        Tenemos varios procesos que son del tipo Batch, o sea, que el 
usuario levanta un archivo y lo vamos procesando.
        Estos procesos pueden llevar al procesador a consumir mas de lo que
queremos y afectan al funcionamiento optimo del Server. (Ya que en el Server
de BackEnd tenemos varios servicios corriendo y no podemos afectar a los 
otros)
        Como hacemos para establecer prioridades a estos procesos o decirle
que solamente consuman hasta por Ej. un 30% o que tengan menor prioridad ?
        O para que el Loop que hacemos con los registros del archivo no se 
lleve todo el procesador.
        (Estos procesos los tenemos que hacer OnLine, no podemos dejarlos
como procesos nocturnos)


Muchas Gracias.



AVISO: El presente mensaje y los archivos adjuntos que incluya pueden 
contener información confidencial de uso exclusivo del destinatario
indicado. Cualquier uso en desacuerdo con su propósito, difusión o
publicación, total o parcial, se encuentra prohibida. Si recibió este
mensaje por error, rogamos reenviarlo al emisor y destruir las copias 
impresas o grabadas en su sistema. Las opiniones contenidas, son
exclusivas de su autor y no representan necesariamente la opinión de
OMINT S.A. de Servicios.







-- 
Daniel A. Calvin
Cooperator Team Member
http://www.cooperator.com.ar <http://www.cooperator.com.ar> 
Microsoft Certified Professional 




-- 
Daniel A. Calvin
Cooperator Team Member
http://www.cooperator.com.ar <http://www.cooperator.com.ar> 
Microsoft Certified Professional 



 AVISO: El presente mensaje y los archivos adjuntos que incluya pueden
contener información confidencial de uso exclusivo del destinatario
indicado. Cualquier uso en desacuerdo con su propósito, difusión o
publicación, total o parcial, se encuentra prohibida. Si recibió este
mensaje por error, rogamos reenviarlo al emisor y destruir las copias
impresas o grabadas en su sistema. Las opiniones contenidas, son
exclusivas de su autor y no representan necesariamente la opinión de
OMINT S.A. de Servicios.

Responder a