Tengo una aplicación de GUI que no tiene tiene una pérdida de memoria. Lo he confirmado con FastMM en numerosos ciclos de prueba. En el servidor de un cliente en particular, recibo bloqueos aleatorios. Las especificaciones del servidor están en línea con las de nuestros otros clientes (y en realidad hemos probado varios tipos de hardware), al igual que los archivos utilizados por el programa (hasta donde sé, hay un material súper sensible que no se puede acceder, pero no parece haber nada fuera de lo común allí).Delphi: compruebe si la memoria se está liberando "a tiempo"
He probado los gustos de EurekaLog y MadShi, para quizás reducir el problema, pero desafortunadamente, solo parecen detectar una excepción en el momento del choque en ocasiones, no todo el tiempo. Cuando lo hace, generalmente muestra uno o más errores de "Memoria insuficiente" antes del bloqueo.
Así que estoy pensando que tal vez algunos objetos se liberen "demasiado tarde", es decir, solo cuando la aplicación se cierre, en lugar de cuando quiero liberarlos? He visto la demo de FastMMUsageeTracker, pero no pude entender todo. ¿Hay documentación en alguna parte? ¿O podría alguien poner palabras (algo accesibles) sobre cómo podría verificar esto?
Alternativamente, ¿cuál sería el mejor enfoque para detectar que la aplicación se está acercando a su "límite de memoria", para tomar algunas medidas preventivas? Si lo entiendo correctamente, una aplicación Delphi regular es de 32 bits, debería ser un buen manejo de hasta 2Gb de memoria (siempre que el hardware lo admita, por supuesto), ¿correcto?
PS: Delphi XE 2009 o, si eso es relevante
Gracias!
EDITAR - Edición posiblemente resuelto
Hemos sido capaces de encontrar un problema por el que una ventana emergente que se cierra y se libera automáticamente después de un tiempo se estaba creando a un ritmo mucho más rápido de lo que estaba desapareciendo. Esto consumiría una gran cantidad de memoria con el tiempo, y luego cualquier asignación de memoria básicamente lo sobrepasaría y desencadenaría el problema de "falta de memoria".
Esto explicaría por qué las trazas de la pila son inconsistentes.
No estoy del todo convencido de que este sea nuestro único problema, ya que, aunque es poco probable, este escenario bien podría haber sucedido antes en los años en que nuestra aplicación se ha ejecutado, pero de alguna manera no es así. Haré muchas más investigaciones sobre este tema.
Gracias a todos los que respondieron, cada respuesta en realidad tiene información valiosa.
PS Las excepciones a la memoria insuficiente pueden aparecer desde aproximadamente 1 GB hacia arriba; no hay un nivel predefinido. Hay muchos factores que parecen influir en el umbral exacto: memoria RAM total, memoria virtual total, cuánto se usan en otros procesos, etc. ¡Además, mi código siguiente es originalmente del rastreador de memoria FastMM! – Misha
Una cosa que vale la pena destacar: nunca he logrado agotar la memoria disponible en proyectos en los que he trabajado, pero he salido de errores de memoria algunas veces. Puede ser causado en ciertos casos por datos corruptos o mal calculados que intentan pedirle al administrador de memoria que asigne un único búfer de unos pocos gigabytes de tamaño cuando todo lo que realmente necesita es unos pocos K o menos. –