Administración de la memoria en Windows y .NET

Quienes hemos desarrollado aplicaciones o hemos estado a cargo de la mantención de un sitio web, en alguna oportunidad nos topamos o seguramente lo haremos en el futuro, con una excepción del tipo “Out Of Memory Exception” o “OOM Exception”.


¿Por qué ocurren los Out Of Memory Exceptions?


Quien haya visto esto, se preguntará, ¿Cómo es posible que tenga 4 GB de memoria en el servidor y mi aplicación se cae por falta memoria cuando “sólo ha ocupado” 800 MB?


Ahora veremos someramente cómo funciona la administración de memoria en Windows y en .NET. No es mi intención cubrir el tema de forma extensa, en especial la administración de .net. Eso lo veremos en sucesivos posts.


Antes de comenzar, quiero hacer hincapié en que este post está basado en otro post de este blog, del cual incluso tomé “prestada” la imagen.


Utilizaremos una analogía para explicar el funcionamiento ya que será mucho más fácil de visualizar y entender. En este caso, la analogía corresponde a un restaurant donde las personas usualmente se juntan a comer en grupos.


¿Cómo se vería este restaurant antes de estar abierto al público, pero una vez que se haya instalado todo lo necesario para su funcionamiento?
Este es un estado “similar” al que correspondería al estado antes de empezar a ejecutar la aplicación. Por “similar” me refiero a que no consideraremos la memoria utilizada para cargar las dlls, utilizada por threads y otros elementos vitales en el funcionamiento de ésta. Sólo nos enfocaremos en la memoria que es pedida y liberada durante el funcionamiento


Este restaurant tendría todas sus mesas disponibles para los clientes que van entrando a comer.


¿Qué sucede cuando se pide memoria al sistema operativo?


Debido a que la solicitud de memoria es un proceso costoso, y suponiendo que se va a realizar miles o millones de veces durante la ejecución de la aplicación, el funcionamiento desde el punto de vista del sistema operativo es diferente a como usualmente lo podríamos suponer.


La memoria, desde el punto de vista del sistema operativo, tiene 3 estados posibles: libre (FREE), reservada (RESERVED) y comprometida (COMMITED).


Una aplicación, al necesitar memoria, le solicita al sistema operativo que le reserve (FREE->RESERVED) un espacio (a veces pequeños, otras veces de varios MBs), para posteriormente manejar élla las miles de solicitudes (RESERVED->COMMITED) y liberaciones (COMMITED->RESERVED) que ocurren a cada segundo. Es decir, el sistema operativo le entrega un pedazo de memoria y la aplicación lo administra. Cuando no le queda espacio libre, le pide al sistema operativo que le reserve otro espacio y el proceso continúa.


La memoria reservada es lo que se conoce con el nombre de VIRTUAL BYTES, y la memoria comprometida, PRIVATE BYTES. Hasta Windows 2003 Server (incluido), ninguno de los contadores de memoria del Task Manager representa estos valores. Solo es posible obtenerlos con performance monitor. Windows Vista si los incorpora, y seguramente Longhorn lo hará también.


Bueno, y ¿qué sucede con el restaurant?


La aplicación es el restaurant, y a  medida que llegan clientes, se va ocupando el espacio en él. Lo importante en este punto es saber cómo se llena.


Supongamos que llamamos al restaurant y decimos que vamos 3 personas. Rara vez, un restaurant tiene mesa para 3 personas. Usualmente son de números pares. Si existe una mesa para 4 personas, nos será reservada para que cuando lleguemos, la podamos utilizar. Lamentablemente para el restaurant, estará perdiendo dinero ya que no podrá utilizar ese espacio libre.


Después de unas horas de funcionamiento, nuestro restaurant se vería así. Todo el espacio blanco es la memoria disponible. Las sillas azules corresponden a las que están reservadas y las rojas a las comprometidas.



En la primera mesa, alguien vino a comer sólo pero tuvo que ocupar una mesa de a dos. Mal para el restaurant.


En la segunda mesa, no le fue tan mal al restaurant. Tuvo que asignar una mesa de a 6 a la que asistieron 4.


La tercera mesa, fue utilizada por 3 personas, hasta llegar al peor escenario para el restaurant. Llega 1 sola persona y le tiene que entregar una mesa de 4.


Por favor notar que la solicitud de las mesas no es bajo ningún criterio de forma secuencial como lo estoy mencionando hasta ahora. La llegada de personas (solicitud de memoria) ocurre en cualquier orden.


¿Dónde comienzan los problemas?


¿Qué sucede si llama una persona y pide una reservación para 4 personas? No existe ninguna mesa disponible para sentar a las cuatro personas.


Alguien podría decir que se puede sentar 1 persona en la primera mesa, 2 en la segunda y 1 en la tercera, pero seguramente los comensales querrán sentarse juntos, y con mucha razón!!. De la misma forma, las solicitudes de memoria se deben entregar en un bloque contiguo.


Otro escenario que no se da en la imagen, corresponde al hecho de suponer que por que en una mesa hay 3 espacios disponibles y en la mesa de al lado 1, se juntan las dos mesas y se les sienta a las 4 personas juntas. Lamentablemente, por cómo se maneja la memoria, no es posible reacomodar las mesas (espacios reservados) una vez que han sido asignadas, como tampoco mover las mesas del restaurant!!!


¿Qué sucede entonces? Suponiendo que no existe más espacio que reservar en el restaurant, al cliente se le dice que está lleno, lo que corresponde a un Out Of Memory.


El dueño del restauran puede estar muy triste por que dejó ir a cuatro clientes cuando potencialmente había espacio para 9 personas más.


El administrador de la aplicación puede estar muy molesto porque la aplicación arroja errores de Out Of memory, pero aún hay memoria en el servidor, o eso dice task manager (en otro post veremos qué es lo que realmente entregan los valores del task manager).


¿Cómo saber cuánta memoria se desperdica? La respuesta es VIRTUAL BYTES – PRIVATE BYTES, es decir, lo que he reservado menos lo que he ocupado.


¿Y desde el punto de vista de .net y el garbage collector (GC)?


El GC le solicita al sistema operativo espacios de 64 MB de memoria contigua, lo que correspondería a una gran mesa de muchos asientos. En este restaurant especial, las personas no se molestan por sentarse juntas en la misma mesa (curioso!!).


Cada vez que se crea un objeto, la memoria requerida por éste se obtiene desde después de la última persona sentada, y así sucesivamente hasta que se llena la mesa.


De vez en cuando, alguien (GC) revisa que las personas que han terminado de comer, efectivamente desalojen el lugar (se libera la memoria) y todos los otros comensales se desplazan para dejar más espacio al final de ésta. Otros argumentan que están esperando a alguien (strong reference) así que aunque ya terminaron, no se levantaran de la mesa (pero si se desplazan), y por último, algunos personajes de “mal temperamento” dirán, no me muevo de aquí (ni se desplazan) porque tengo asiento con ventana y la vista está muy hermosa hoy. Estos últimos son objetos que han sido referenciados desde fuera del código manejado (pinned object).


Para el último caso, los pinned objects, nadie puede moverse hacia delante de la mesa mientras ellos estén en ella. Esto produce espacios vacios en la mesa, entre ellos u los de adelante, lo que se conoce como fragmentación de memoria en .Net. Este tipo de objetos no se puede mover ya que en código no manejado, las posiciones en memoria jamás cambian, no asi en .net ya que cada desplazamiento de la mesa implica nuevas posiciones para los objetos.


Una vez que se llena la mesa, se le pide al sistema operativo otra mesa de 64 personas, ¿y si no hay disponible?..ya adivinaron no?, Out Of Memory Exception.


Debido a lo anterior, tenemos que ser muy cuidadosos al desarrollar código, haciendo dispose y liberando los recursos apenas dejen de utilizarse. Ya hablaremos de esto pronto.


Patrick.

70 Replies to “Administración de la memoria en Windows y .NET”

  1. Buena tarde, tengo una aplicación que se desarollo en v.0, luego fue mirgada a 6.0, y actualmente esta montada en un servidor de terminal server y mas de 100 usuarios se conectan atravez deeste servidor, pero se esta presentado el inconveniente que én cualquier momento y cualquier usuario, llena la memoria del servidor y bloquea el funcionamiento de los demás que puedo hacer, que se debe ??

    gracias, pueden escribir a compujab@hotmail.com

  2. Patrick,

    Te escribo desde Chile, mira hacer un tiempo un colega desarrollo un programa en vs 2003 con lenguaje VB.net, el problema es que cuando el estaba aca (hace 3 años) el programa funcionaba de maravilla….. y hace un tiempo que el programa AUNQUE NO LO CREAS, “Funciona solo con el Adminsitrador de Tareas “Abierto”. Tu sabes a que se debe???.

    Es insolito, la verdad que no he dormido tratando de averiguar. Pero no logro nada…. y tu sabes que pedirle a un usuario Ehhh… Ejecutelo con el Trask Manager abierto es como PENCA.

    Saludos,
    JMC

  3. ¿qué tipo de soluciones técnicas requieres?, más allá de todas las documentadas respecto del uso responsable de los recursos de un servidor…

  4. Good morning
    ive been prescribed valproic acid its also called depekote for bipolar i was just wandering if its helped anybody and were there any negative side affects and how it made you feel price
    Bye !!
    ____________________________
    best price on 🙂

  5. Good morning
    It really depends on how you understand “generic.” Although in pharmacology, we often prescribe drugs in its generic form which is also the active ingredient of the drug. For the brand Levitra’s case, it’s active ingredient is Vardenafil, hence it is also its generic name. generic
    Pa!!!
    ____________________________
    cheap online 🙂

  6. Hi
    Not a good combination, if you never took the two before you might fall out and go to sleep, very, very quickly. Yes I have taken the two before. A good combo if you want to ruin your entire afternoon. uk generic
    Goodluck!!!
    ____________________________
    canada 🙂

  7. Very nice post. I just stumbled upon your weblog and wished
    to say that I have truly enjoyed browsing your blog posts.
    After all I’ll be subscribing to your feed and I hope you write again soon!

  8. Прошивки Все о ремонте и для ремонта сотовых телефонов, 3G-4G модемов, радиостанций, ноутбуков, навигаторов, mp3 плееров, планшетников. Новости, обзоры, инструкции, солюшены, прошивки, программы.! Заходите на Мобильный Мульти Сервис – MobiMS.ru.

  9. Nice post.I learn something more challenging on different blogs everyday.It will always be stimulating to read content from other writers and practice a little something from their store.I’d prefer to use some with the content on my blog whether you don’t mind.Natually I’ll give you a link on your web blog.Thanks for sharing.

  10. Excellent goods from you, man. I’ve understand your stuff previous to and you’re just extremely fantastic. I actually like what you’ve acquired here, really like what you’re stating and the way in which you say it. You make it enjoyable and you still care for to keep it wise. I cant wait to read much more from you. This is actually a terrific website.

  11. Most of these post will always be inspiring and that i would rather read great content so I am able to see many beneficial point here in the article, writing is definitely great, thank you for the post.

  12. This is the right blog for anyone who wants to find out about this topic.You realize so much its almost hard to argue with you (not that I actually would want…HaHa).You definitely put a new spin on a topic thats been written about for years.Great stuff, just great!

  13. My developer is trying to convince me to move to .net from PHP. I have always disliked the idea because of the costs. But he’s tryiong none the less. I’ve been using Movable-type on various websites for about a year and am anxious about switching to another platform. I have heard excellent things about blogengine.net. Is there a way I can transfer all my wordpress posts into it? Any kind of help would be greatly appreciated!

  14. Stumbled across your post while searching through yahoo. I study the beginning and its huge! I don’t have time for you to finish it now, but I have bookmarked your article and will check out the rest later. : )

  15. I just could not leave your site prior to suggesting that I extremely enjoyed the standard information an individual supply on your guests? Is going to be back often in order to investigate cross-check new posts

  16. Sometimes seeing another person’s point of light enlighten my very own vision. I’m not going to going to say what everybody else has already stated, however i must say, I cant believe how a lot of this I just wasnt aware of .Thanks for publishing more info to this matter for us.

  17. A large percentage of of what you mention is supprisingly precise and that makes me ponder why I hadn’t looked at this with this light previously. This particular article truly did turn the light on for me personally as far as this particular topic goes. But there is actually one particular issue I am not really too comfy with and whilst I try to reconcile that with the central idea of your position, let me observe exactly what the rest of your subscribers have to point out.Nicely done.

  18. Hi webmaster, commenters and everybody else !!! The blog was absolutely fantastic! Lots of great information and inspiration, both of which we all need!b Keep ‘em coming… you all do such a great job at such Concepts… can’t tell you how much I, for one appreciate all you do!

  19. Do you mind if I quote a couple of your articles as long as I provide credit and sources back to your website? My blog is in the very same area of interest as yours and my visitors would definitely benefit from some of the information you provide here. Please let me know if this ok with you. Thanks!

  20. The next time I read a blog, I hope that it doesnt disappoint me as much as this one.I mean, I know it was my choice to read, but I actually thought youd have something interesting to say.All I hear is a bunch of whining about something that you could fix if you werent too busy looking for attention.

  21. I really appreciate your work to this site. So thanks for it. I hope you can continue this type of hard work to this site in future also. Because this blog is really very informative and it helps me lot. I am delighted to find many useful things here, that’s superb. Thanks for sharing.

  22. Hey! This is kind of off topic but I need some help from an established blog. Is it hard to set up your own blog? I’m not very techincal but I can figure things out pretty quick. I’m thinking about setting up my own but I’m not sure where to begin. Do you have any ideas or suggestions? Cheers

  23. I’m truly enjoying the design and layout of your site. It’s a very easy on the eyes which makes it much more pleasant for me to come here and visit more often. Did you hire out a developer to create your theme? Exceptional work!

  24. Along with every thing that seems to be developing within this subject matter, your points of view happen to be somewhat exciting. On the other hand, I am sorry, but I can not give credence to your whole suggestion, all be it exhilarating none the less. It would seem to everybody that your remarks are actually not entirely rationalized and in fact you are generally your self not even wholly certain of the point. In any case I did take pleasure in reading through it.

  25. Thanks for making the sincere effort to speak about this. I believe very sturdy approximately it and would like to read more. If it’s OK, as you achieve more extensive wisdom, might you mind including more articles very similar to this one with additional info? It would be extraordinarily useful and helpful for me and my friends.

  26. Hey there! Would you mind if I share your blog with my zynga group?
    There’s a lot of people that I think would really enjoy your content.
    Please let me know. Cheers
    flight hotel tokyo hotel hotel booking booking hotel

Leave a Reply

Your email address will not be published. Required fields are marked *