Hola Angel,

Ahí estoy haciendo algunas pruebas. Básicamente estaba declarada como
static con nothing y cuando se hacia un BeginRequest se validaba si ya se
habia inicializado, en caso que no, se procedía a recorrer los asemblies y
se llenaba el XMLDocument. Hasta ahi el stratup del app.

Ahora lo hice como dijiste, con carga on demand. Apenas termine los stress
test aviso :)



Saludos,
Ing. Damián Herrera
Director
CIVINEXT
Tel. / Fax: +54 (11) 3968-0039
[email protected]
http://www.civinext.com
<http://www.linkedin.com/company/civinext-s.a.>
<http://www.facebook.com/groupware><http://www.twitter.com/damianherrera><http://www.youtube.com/user/damianherrera>
  <http://es.wikipedia.org/wiki/Civinext>



El 19 de marzo de 2013 14:32, Angel "Java" Lopez
<[email protected]>escribió:

> Hola gente!****
>
> ** **
>
> Damian, pequenia gran pregunta:****
>
> ** **
>
> Tenes la declaración del XML Document? Digo, la línea donde esta declarada
> la variable.****
>
> ** **
>
> No se si al principio esta en Nothing, y el startup lo CREAS Y LLENAS, o
> si en la variable estatica lo creas con new, y en el startup LO LLENAS.***
> *
>
> ** **
>
> Otra cosa: alguna pista en el Event Viewer? De reinicio de la aplicación?*
> ***
>
> ** **
>
> Si fuera por mi, no llenaría el XML Document en el startup, sino la
> primera vez que alguien lo pide (haciendo que su variable al comienzo este
> en Nothing, y controlando por Nothing cada vez que alguien lo pide). Y
> loguearia en algún lado cuando paso por esa rutina de llenado, para ir
> investigando cuando se llena de nuevo.****
>
> ** **
>
> Angel “SeDispararaElStartup?EstaraElAssemblyDisponibleAlLlegarAlStartup?”
> Lopez****
>
> ** **
>
> *From:* [email protected] [mailto:[email protected]] *On Behalf Of *Damián
> Herrera
> *Sent:* martes, 19 de marzo de 2013 11:57 a.m.
> *To:* [email protected]
> *Cc:* [email protected]
>
> *Subject:* [puntonet] Manejo de memoria en ambientes sobrecargados****
>
> ** **
>
> Hola Angel,****
>
> ** **
>
> jajaja bien, si, es correcta la pregunta. Tengo "cosas" que guardo en un
> cache propio para tener mejor eficiencia en las consulta a los mismos, pero
> no es así en todos los temas que escribi. ****
>
> ** **
>
> Por ejemplo, el XMLDocument es un object static que se llena únicamente en
> el startup del webapp. Esto funciona bien, pero tengo este problema que
> debes en cuando se vacía  Necesito este XMLDocument porque en el mismo
> almaceno XMLs que estan como recursos embebidos en un assembly, entonces
> para no recorrer ese assembly cada vez, lo hago únicamente al inicio y
> luego consulto contra este XMLDocument donde estan todos los XML
> unificados. Respondiendo a las preguntas en este caso:****
>
> 1) En el objeto estatico. ****
>
> 2) Este punto no tiene httphandler.****
>
> 3) Es un objeto estatico.****
>
> 4) Me da un error provocado por mi, que al buscar a través de un XPath en
> el XMLDocument y no tener resultados, lanzo una excepcion directamente.***
> *
>
> ** **
>
> El tema del Dictionary lo estoy debugeando todavía, porque no estoy seguro
> de si es el Dictionary el que me da "Object reference not set to an
> instance of an object" o un elemento dentro de él.****
>
> ** **
>
> Y por el tema de los javascript en cache, no te quiero aburrir, pero si,
> esa es una larga historia que empezó cuando pasamos de la version .Net 1.1
> a la .Net 2.0 y el manejo de cache que hacia ASP.Net. Todo eso derivo en la
> creación de una suerte de cache propio llamado Workspaces
> que básicamente gestiona Cache y Session de una manera sencilla, pero con
> depuración automática de objetos sin uso y demás cosas propias de un cache.
> ****
>
> ** **
>
> Para mi, tampoco es el GC el que esta molestando en este caso. Para mi, es
> algo más vinculado al SO o algo similar. Porque en el caso del XMLDocument
> no hay explicación. Y con el tema del Javascript tampoco.****
>
> ** **
>
> 6) Básicamente fue un cambio interior a partir de ver como evoluciona
> la tecnología,  lo que hacen los departamentos de marketing y demás yerbas.
> La premisa que me dio la experiencia es que los objetos creados por uno
> (clases y objetos) siempre perduran a través de los cambios y
> evoluciones tecnológicas. En cambio un ASP.Net cache, un Dataset tipado
> y poniéndonos melancólicos un Recordset no son objetos que duren en el
> tiempo. Es más una filosofía a esta altura que un fundamento :) ****
>
> ** **
>
> ** **
>
> ** **
>
> ** **
>
>
> ****
>
> Saludos,****
>
> Ing. Damián Herrera
> Director
> CIVINEXT
> Tel. / Fax: +54 (11) 3968-0039
> [email protected]
> http://www.civinext.com****
>
> <http://www.linkedin.com/company/civinext-s.a.> 
> <http://www.facebook.com/groupware><http://www.twitter.com/damianherrera><http://www.youtube.com/user/damianherrera>
>   <http://es.wikipedia.org/wiki/Civinext>****
>
> ** **
>
> ** **
>
> El 19 de marzo de 2013 11:11, Carlos Salvatore <
> [email protected]> escribió:****
>
> Damián,
>
>
>    Me parece que si las referencias siguen vivas, no es un problema del
> GC. El GC no debería liberar memoria y dejar las referencias "vivas". Eso
> te podría pasar con un puntero pero no con una referencia en un entorno de
> memoria manejado.
>
>    Si no entiendo mal, lo que vos describís sería lo siguiente. Vos tenés
> una serie de objetos estáticos. Esos objetos son consultados a través de
> una suerte de caché. ¿Hasta ahí es correcto?
>
>    Entonces
>    1) Dónde las colecciones se truncan? En el caché o en objeto estático?
>    2) WWWWH vacía el caché?
>    3) Por qué el resguardo del caché es otro objeto en memoria?
>    4) Qué sucede cuando el caché no tiene la colección? La busca en la
> referencia estática? Verifica de algún modo que la referencia estática no
> sea nula? En algún punto de este proceso se dispara la carga de estas
> colecciones? (Podría pasar como resultado de la concurrencia que dos
> threads distintos manden a cargar las colecciones y el segundo trunque la
> carga del primero)
>    4B) ¿Existe la posibilidad de que algún try/catch te esté escondiendo
> una excepción de concurrencia?
>    5) Si la caché en memoria apunta a otro objeto en memoria, cómo se
> persisten estas colecciones (desde dónde se carga el contenido del objeto
> estático, si es que se hace en algún momento)?
>     6) Dado que ya sabemos que Aristóteles le criticó a Platón su solución
> de duplicar los objetos hace más de dos mil años, cuál sería la causa que
> justificaría que hagas lo mismo en tu aplicaición? (alerta de chicana, no
> tomar a mal).
>  ****
>
> ------------------------------
>
> Date: Tue, 19 Mar 2013 10:47:34 -0300
> Subject: [puntonet] Manejo de memoria en ambientes sobrecargados
> From: [email protected]
> To: [email protected]****
>
> ** **
>
> Hola Angel,****
>
> ** **
>
> Gracias por tu respuesta. Si, los objectos son compartidos por todos los
> threads, son elementos static/shared de clases. En principio
> no habíamos configurado el recicle del App Pool, hace ya unos meses lo
> tenemos configurado para que todas las noches se recicle y eso hizo que se
> caiga menos veces. La infraestructura es un Win 2008 R2, 64 bits, App Pool
> en .Net 4 con el Managed Pipeline en Integrated mode.****
>
> ** **
>
> No es lo que dije originalmente, pero también tuve este tipo de problemas
> con Recursos embebidos en el assembly. Básicamente son archivos de
> javascript que cuando son pedidos a través de un HttpHandler se buscan en
> un cache interno (que termina consultando un  Synchronized Hashtable y de
> vez en cuando, una vez por mes o cada tanto el javascript estaba roto, es
> decir, me devolvía las primeras 200 lineas y el resto no estaba :) Esto lo
> solucione poniéndole una marca al final del archivo para saber si lo que
> tenia en memoria estaba completo o debía ir a buscarlo de nuevo al assembly
> :s A partir de este caso pienso que hay veces que el proceso llega a un
> punto donde se "estresa" y limpia su memoria dejando algunas posiciones
> medio rotas.****
>
> ** **
>
> Se que suena a poco probable, el tema es que sucede cada tanto y no es
> algo que pueda repetir en un ambiente controlado. En general hago stress
> test de la webapp y funciona bien. No llego a tener estos problemas. ****
>
> ** **
>
> ** **
>
> ** **
>
>
> ****
>
> Saludos,****
>
> Ing. Damián Herrera
> Director
> CIVINEXT****
>
> Tel. / Fax: +54 (11) 3968-0039
>
> *[email protected]*
> *http://www.civinext.com***** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>   **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> ** ** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> ** ** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> El 19 de marzo de 2013 07:43, Angel "Java" Lopez <*[email protected]*>
> escribió:**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Hola gente!**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Hmmm… Damian, no tengo todo el contexto, pero vieron si es algun problema
> de concurrencia? Digo, estan ejecutando varios threads cuando tienen alto
> trafico? Y esos threads estan accediendo a esos objectos en memoria? Son
> compartidos entre los threads?**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Por lo que entendió, tenes objetos que VIVEN un tiempo en memoria
> (horas?), y son consultados o manejados durante el alto trafico por los
> clientes que llegan.**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> En donde esta corriendo esto? En un IIS, en un servicio, en Azure, en un
> web farm? Reciclado de una instancia puede haber  … (a la Yoda 
> ;-)****<#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Nos leemos!**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Angel “Java” Lopez**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> @ajlopez**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> *De:* *[email protected]* [mailto:*[email protected]*] *En nombre de 
> *Damián
> Herrera
> *Enviado el:* Monday, March 18, 2013 5:54 PM
> *Para:* *[email protected]*
> *Asunto:* [puntonet] Manejo de memoria en ambientes 
> sobrecargados****<#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Buenas,**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Espero que anden bien. Hace mucho que no escribo y buscando algo de info.
> me pareció que era algo para postear en la 
> lista.****<#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Actualmente tenemos un problema en ambientes de alto
> trafico, básicamente manejamos Generic.Dictionary(string,string) y
> Xml.XmlDocument. Únicamente en ambientes de alto trafico, nos sucede de vez
> en cuando que desaparecen elementos del Dictionary o el XmlDocument
> queda vacío.**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Sospecho que el XMLDocument queda vacío porque hay momentos en los que no
> se utiliza porque hay una capa de cache que hace que se lo consulte poco,
> pero la referencia sigue activa dentro de una clase (esta declarado como
> private shared). Algo similar ocurre con el Dictionary, pero este se usa
> más que el XmlDocument.**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> La consulta en si misma es, hay alguna forma de "marcar" o especificar que
> esas variables no deben ser recolectadas o alguna manera de que me entere
> cuando las recolectan? Es algo que estuve buscando y no encontré mucha
> info. y no estoy seguro que tenga que ver con el 
> GC.****<#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>  **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Bueno, cualquier orientación se 
> agradece.****<#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>
> **** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Saludos!**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> Ing. Damián Herrera
> Director
> CIVINEXT**** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> <#13d83b6bbc46a4a9_13d82fd31c45d795_>
> Tel. / Fax: +54 (11) 3968-0039
> <#13d83b6bbc46a4a9_13d82fd31c45d795_>
> *[email protected]*
> *http://www.civinext.com*****
>
>   ****
>
>  ****
>
> <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> ** ** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
> ** ** <#13d83b6bbc46a4a9_13d82fd31c45d795_>
>
>

Responder a