A ver este problema no está ligado a ningún juego ni ningúna aplicación de software gratuito. Esto lo me pasó mientras trabajaba.
Como muchos sabeis soy desarrollador de software para móbiles (a esperas de pasarme a microsoft...). Bueno el caso que os voy a contar me ha sucedido desde el pasado lunes hasta hoy martes dos dias... eso son 16 horas de trabajo.
Estoy desarroyando un software para un dispositivo windows CE el cual debe permitir navegar entre diferentes pantallas. Este software ha funcionado bien durante años para empresas pequeñas pero ahora me han pedido que lo modifique para una empresa más grande. El caso es que entre las diferentes ventanas se tratan como diferentes pasos y de una a otra se necesita la anterior.
El caso es que en los casos anteriores se cargaban entre 1000-2000 filas que se tenian que deserializar. Pero con mi nuevo proyecto eran 27.000. Esto es... muchas filas el caso es que bueno me ha salido un problema en el que al cargar las filas la primera vez cuesta 4 segundos... bueno una aplicación con interactividad... bueno 4 segudos... se podía espera pero aleatoriamente tenía parones... pero parones de la ostia xD (2 minutos) y luego seguía normal.
Además el código de deserializar no es mio y tenía que inverstigarlo...
El caso es que lo primero que he llegado a pensar en los siguientes casos
thread-> no puede ser, ya que estaban todos dormidos menos el de carga.
Memoria->de sobra 18 Mb y no bajaba (luego analizaremos más a fondo esto)
funciones internas de carga-> como se analiza la cadena para deserializar(ya que gasta un tokenizer) etc...
sistema operativo-> puede que el sistema operativo tenga la culpa...
en fin después de evaluar todo esto (casi un día de trabajo) NO TENíA ningún resultado... todas las pruebas eran contradictorias... los threads bien... memoria de sobra... las funciones del código eran simples.
El caso es que me ha dado por detenerme a observar el algoritmo de inserción. En el lo que se hacía es reservar un puntero dinámico de tipo objeto a deserializar, crear memoria por cada fila del fichero y deserializarla. En caso de cumplir cierta condición no se debe de cargar la fila. Entonces me he dado cuenta que este algoritmo estaba creando pequeñas secciones de memoria y destruyendolas. Por lo que al final he llegado a pensar que pese a no estar ocupando memoria estaba creando fragmentación y llegado cierto punto de fragmentación el sistema operativo toma las riendas y a partir de ahí reordena la memoria o hace lo que tenga que hacer se crea su lista de bloques vaciós adyacentes o algo y luego me sirve la memoria. Entonces en ese caso se suceden los cortes...
Bueno esta es mi teoría que pensais?
RESUMEN.
No es bueno crear y eliminar memoria dinámica en un bucle muy grande no solo por la memoria sino por el propio gestor del sistema operativo. O no?