Hola Diego rapidito, estoy medio tapado....
Thread.Sleep (Método) Bloquea el subproceso actual durante el número de milisegundos especificado. Thread.Sleep (Int32) Pegale una miradita a: http://msdn2.microsoft.com/es-es/library/system.threading.thread(VS.80).aspx Si no te alcanza decime y tratao de armar un ejemplito. :)) Daniel El día 11/10/07, JATEMLIANSKY, Diego <[EMAIL PROTECTED]> escribió: > > 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] > 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] *En nombre de *Daniel > > Calvin > > *Enviado el:* Jueves, 11 de Octubre de 2007 10:59 a.m. > > *Para:* [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 < [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, BackEnd en > > > Servicios > > > de Windows 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 > > Microsoft Certified Professional > > > > > > -- > Daniel A. Calvin > Cooperator Team Member > 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. > > -- Daniel A. Calvin Cooperator Team Member http://www.cooperator.com.ar Microsoft Certified Professional
