Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 8 Agosto 2013, 09:12 am



Título: Experimento de consumo de memória... ver para creer!
Publicado por: Eleкtro en 8 Agosto 2013, 09:12 am
Hoy he descubierto algo que me ha impactado bastante.

Creamos un nuevo WinForm, y lo dejamos EN BLANCO, es decir, sin ningún tipo de código, simplemente el Form1.vb generado por el VS...

Ahora, si compilamos esa aplicación vacía, al mover el mouse sobre el form, sólo esa acción consume unos 8kb cada segundo. (no estoy seguro de si se trata del evento MouseEnter o del MouseMove, o quizás el problema no sea de un Evento y sea otra cosa que desconozco)

Lo más impactante de este experimento es que dicho consumo jamás se llega a liberar!, cuanto más muevo el mouse por el Form, más subre el consumo de RAM, 8 kb cada vez que muevo el mouse por el form, pero ese consumo nunca vuelve a bajar, y esto quiere decir que un Form vacío podría dar un problema de overflow sólamente por mover el mouse por el form!!?¿

¿Como es esto posible?, ¿Cual es la razón?, ¿Que se puede hacer para solucionarlo?, ¿Alguien más se habia dado cuenta de esto antes?.

PD: No se si es un WinForm de C# pasará lo mismo Con un Winform de C# sucede exáctamente lo mismo, lo he testeado con VB.NET, con Framework 4.0 y 4.5.


EDITO:

Con Java es incluso peor, es traumático, al mover el mouse sobre el background de una aplicación vacía la memória aumenta por MB's cada segundo, no por kb's, y no se llega a liberar jamás tampoco, puede pasar de 40 mb a 60 mb en menos de 30 segundos símplemente por mover el mouse por la ventana sin parar, y encima ese consumo no va a bajar nunca, es increible, en fín si que es cierto lo que dicen sobre Java y el consumo de RAM si...

Tengo algunos programas profesionales de terceros desarrollados en C/C++ y al mover el mouse por sus ventanas no sube el consumo en absoluto.



Bueno, ahí dejo el experimento, espero que alguien pueda dejar explicaciones sobre las causas de estos sucesos paranormales,
y si se puede evitar de alguna manera ese consumo excesivo OverRideando algún método o... como sea!!.



Saludos.


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Eleкtro en 8 Agosto 2013, 20:10 pm
...

Para los más excépticos aquí podeis ver el problema con vuestros propios ojos:

sBxicL_x9HQ


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: X3R4CK3R en 8 Agosto 2013, 20:48 pm
...

Para los más excépticos aquí podeis ver el problema con vuestros propios ojos:

sBxicL_x9HQ

no, al menos yo no puedo. :huh:


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Eleкtro en 8 Agosto 2013, 20:58 pm
no, al menos yo no puedo.

Si lo pones a pantalla completa y a calidad a 720p seguro que si xD... no sé si te refieres a eso.. o lo que no ves es el aumento de memória..

 saludos!


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Novlucker en 8 Agosto 2013, 21:00 pm
Probé lo que comentas y si, pasa eso, incluso cambiando opciones de compilación :o

Saludos


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: X3R4CK3R en 8 Agosto 2013, 21:01 pm
Si lo pones a pantalla completa y a calidad a 720p seguro que si xD... no sé si te refieres a eso.. o lo que no ves es el aumento de memória..

 saludos!

Ya lo veo, me daba problemas con el protocolo https, sorry


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Eleкtro en 8 Agosto 2013, 21:11 pm
Probé lo que comentas y si, pasa eso, incluso cambiando opciones de compilación :o

Como me gusta oir eso vininiendo de un experto, no estoy loco! xD

Pues lo dicho, y en Java es inclusive peor ya que se dispara el consumo por Megabytes como ya he dicho, pero bueno, Java no me importa.

En otros lares me dicen que haga un research sobre como trabaja la memória en .NET... y yo me pregunto, ¿Que es lo que debo buscar si para empezar no se ni cual es la raiz dle problema, ni tampoco se cual es el problema en si mismo?, ¿Por donde empiezo?, en fín en esos lares me dicen un sin fin de cosas que considero tonterías y se meten conmigo los típicos Trolls pero nadie me dice nada en concreto, mucho listillo y experto pero ninguno sabe decirme algo en concreto! (no lo digo por ti, novlucker)

Cosas como estas ya las sé, pero no me aclaran nada:

· ¿Porque el consumo de memoria aumenta sobre los 8-16 kb progresívamente cada segundo al mover el mouse por un Winform?

Citar
There are messages that trigger for handling mouse movement, etc, which get processed by the form.
(Vale, pero una vez interceptados los messages y raiseados los eventos porque sigue subiendo sin parar?)

· ¿Porque ese aumento de memória no vuelve a disminuir nunca?

Citar
It will. Eventually, you'll see your memory settle down. In C# and VB.Net, the garbage collector doesn't immediately clean up memory (by design), but lets it grow, and will clean up as needed. In general, you'll tend to see .NET applications grow in their memory usage, then drop dramatically, then grow again, then drop, etc. If you have a lot of memory in your system, the "drops" happen infrequently, since a garbage collection is expensive, and there's absolutely no disadvantage to using memory that's not needed elsewhere.

PD: La última respuesta no tiene validez para mi, ya que el experimento demuestra que eso no es cierto en este caso, el GC "no hace nada".

Si alguien se aburre y quiere ver el resto en inglés... http://stackoverflow.com/questions/18132115/memory-consumption-keeps-growing-when-just-moving-the-mouse


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: $Edu$ en 8 Agosto 2013, 21:44 pm
Pero hazlo hasta el extremo a ver si tu pc se cuelga o algo, si no es asi es porque como dice por ahi "el GC lo deja crecer pero cuando es necesario lo borra"


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Eleкtro en 8 Agosto 2013, 22:14 pm
Pero hazlo hasta el extremo a ver si tu pc se cuelga o algo, si no es asi es porque como dice por ahi "el GC lo deja crecer pero cuando es necesario lo borra"

Sip, no se si leiste mi respuesta a eso, ese será mi próximo experimento xD

Dejaré una VM con 64 de ram y WinXP, un script que mueva el mouse sobre el Form, y a ver lo que pasa...  :silbar:

PD: ¿Alguien ha notado mi obsesión por el consumo de RAM? xD, pues si, quiero que mis aplicaciones rocen la perfección... y para que llegue ese día necesito aprender y descifrar acertijos como estos.

Saludos


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: El Benjo en 9 Agosto 2013, 02:08 am
¿Te ocurre únicamente en modo de de puración? Porque he probado mis aplicaciones ya compiladas y en depuarión. Al principio se presenta el mismo incremento de memoria, pero no sube más de 500kb.

Las condiciones en las que he realizado la prueba son:

Visual Studio 2010 express
Compilación para .NET Framework 4.0

¿Crees que sea problema del VS 2012?

Como te comento, comienza a subir en ambos casos pero en ninguno sube de manera alarmante. En modo de depuración se incrementa más el uso de memoria.


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: raul338 en 9 Agosto 2013, 16:14 pm
Y si pruebas ejecutando el EXE en release SIN el depurador de visual studio? Porque quizás sea alguna depuracion o guardado de la pila al depurar


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Eleкtro en 9 Agosto 2013, 16:17 pm
Y si pruebas ejecutando el EXE en release SIN el depurador de visual studio?

¿Te ocurre únicamente en modo de de puración?

os cuento, tanto en debug como en release sucede, y tanto con el debugger adjuntado como sin ninguno adjuntado ,en VB y en C#, testeado en VS2012, Framework 4.0 y 4.5

saludos!


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: 1mpuls0 en 9 Agosto 2013, 23:56 pm
Me causa curiosidad tu tema y estoy investigándolo (para el caso de Java)

Aquí algunas respuestas.

Citar
GunitLoco Lowrider
son 3 megas de diferencia proporciona mas datos, como tiempos o el máximo de consumo de tu aplicación vacia

Melvin
y lo divides entre E*8


GunitLoco Lowrider
le aplicas la raiz cuadrada y sacas el diferencial a la menos 1


Melvin
y asi obtendras la potencia en mili bites que usas por milimetro en cada segmento de pila de la memoria

Bueno por lo menos tu recibiste una respuesta coherentes y no este tipo de respuestas pendejas de estos dos "ingenieros en sistemas"

Perdonen que hable de Java en este tema de .Net, tal vez deberíamos llevarlo más allá debido a la similitud del problema. Incluso probar con otro tipos de lenguajes que utilicen interfaz gráfica.

Si bien es sabido Java puede ser considerablemente más lento y puede tomar más espacio en memoria que otros lenguajes compilados.
Pero lo que muestra EleKtro H@cker es inconcebible.

Mi suposición es que este problema es causado por el tema de garbage collector, threads, graphics o las tres en conjunto, aunque claro estoy abierto a cualquier otra opción.

Seguiré investigando.

Saludos.


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: El Benjo en 10 Agosto 2013, 01:23 am
Y sin embargo yo insisto en que en las pruebas que he realizado la memoria utilizada por la aplicación no aumenta en más de 500 kb y se detiene el consumo de memoria. No lo estoy justificando para nada, porque lo cierto es que no debería subir nada o al amenos debería liberarse después de subir, pero lo que digo es que en mi caso no se presenta un consumo exagerado y este además se detiene.

¿Elektro, puedes subir un video donde se muestre algún aumento exagerado (algunas decenas de Mb) o decirnos hasta cuánto ha llegado este aumento?


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Eleкtro en 10 Agosto 2013, 09:44 am
¿Elektro, puedes subir un video donde se muestre algún aumento exagerado (algunas decenas de Mb) o decirnos hasta cuánto ha llegado este aumento?

Con .NET me va a costar un poco más porque sube léntamente así que necesita varias horas para mostrar subidas exageradas... hoy haré el experimento de la VM y dejaré grabándolo en video.

Con Java si que puedo mostrarte como subre de 30 a 60 MB en menos de 30 segundos, también lo mostraré.

Por cierto, ElBenjo, quizás ayudaría que también mencionases el SO y la cantidad de RAM de la que dispones para que los expertos puedan intentar entender porque a ti solo te sube 500 kb.

Yo tengo Windows 8 x64 y 8GB de RAM, nunca consumo mucha ram ni tengo muchas aplicaciones pesadas abiertas.

Saludos!



Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: El Benjo en 11 Agosto 2013, 00:52 am
Cierto, Elektro se me olvidó mencionar el S.O. Yo utilizo Windows 7 Profesional 32bits


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Stakewinner00 en 11 Agosto 2013, 00:58 am
Todos sabemos que todo lo que tenga que ver con microsoft esta lleno de bugs.

Por cierto ami me llegaba a un tope, me subió hasta un máximo de unos 2000 kb


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Maurice_Lupin en 11 Agosto 2013, 19:53 pm
Tengo una lentium IV, 1Gb de ram. Probe una aplicación con un form, su consumo oscila entre 9,200 Kb y 9,600 Kb.

No me sorprende tanto el consumo de memoria de vb.net y java, pues al ser lenguajes interpretados constantemente su codigo esta siendo convertido a lenguaje maquina. Si de consumo de ram se trata deberiamos programar en C/C++ o ASM.

Saludos.


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: El Benjo en 12 Agosto 2013, 09:11 am
No me sorprende tanto el consumo de memoria de vb.net y java, pues al ser lenguajes interpretados constantemente su codigo esta siendo convertido a lenguaje maquina.

No creo que el código sea convertido a lenguaje máquina con cada movimiento del mouse. Porque de hecho no es realmente interpretado en tiempo de real, sólo durante el inicio de la aplicación. Hay que recordar que el .NET Framework cuenta con el JIT

En todo caso todavía me quedo en que es por cuestión del código del propio framework.


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Maurice_Lupin en 12 Agosto 2013, 19:49 pm
Por cierto tengo win XP.

Saludos.


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Novlucker en 12 Agosto 2013, 19:59 pm
Por cierto ami me llegaba a un tope, me subió hasta un máximo de unos 2000 kb

Volví a probar a ver hasta donde llegaba, me pasó igual, subió unos 2MB y se detuvo.

Saludos


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: 1mpuls0 en 12 Agosto 2013, 20:33 pm
Volví a probar a ver hasta donde llegaba, me pasó igual, subió unos 2MB y se detuvo.

Saludos

Pero así sea 1kb sería correcto que lo hiciera?.


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: Novlucker en 12 Agosto 2013, 20:45 pm
Pero así sea 1kb sería correcto que lo hiciera?.

Habría que analizar en profundidad el motivo, pero en ocasiones exageramos, me dan igual 2MB si en la máquina tengo 8GB :P


Título: Re: Experimento de consumo de memória... ver para creer!
Publicado por: 1mpuls0 en 23 Agosto 2013, 19:33 pm
Realicé mi test.

Espacio en memoria inicial: 8, 736 kb
Hora de inicio: 12:09:40 PM
Incremento: 8 kb
Espacio en memoria final: 11, 550 kb
Hora final: 12:16:20 PM
∆Memoria: 2,814 kb = 2.74 MB
∆Hora: 6 min 40 seg

Sistema Operativo: Windows 7 64 bits
Memoria RAM: 6 GB
Procesador: Intel Core i7 a 2 GHz

Herramienta: Visual Studio 2010 32 bits
Framework: 4.0

Realicé la prueba dos veces, aunque la primera no tomé los datos porque cometí el error de hacer más grande la ventana del form y de aumentar de 8 kb paso a 100 kb  ;D y bueno eso ya es un poco más lógico (o no?).

La segunda prueba son los datos que muestro, después de ese tiempo dejó de subir el espacio en memoria.