Re su última Q: la versión corta: el mensaje de error es sobre el espacio de direcciones virtuales "comprometido". Si observa el gráfico Commit Charge en su segunda captura de pantalla, verá que, de hecho, está en el límite o muy cerca.
La cantidad de RAM que es "libre", "disponible" o "en uso" no importa. En particular, la escasez de RAM "disponible" no es absolutamente la razón del mensaje de "poca memoria" o "falta de memoria".
El límite de confirmación es igual al total de RAM + tamaño del archivo de paginación. Cuando se asigna la memoria comprometida, se carga inmediatamente a "carga de compromiso" aunque aún no se haya utilizado realmente ... lo que significa que no se usa espacio RAM o PF de inmediato. El espacio físico (ya sea en la RAM o en el archivo de paginación) solo se usa cuando se hace referencia a la memoria. A partir de ese momento, debe tener un lugar donde estar, hasta que el programa lo libere o hasta que finalice todo el proceso.
Ejemplo: suponga que no tiene un archivo de paginación, por lo tanto, su límite de confirmación es de 16 GB (el tamaño de su RAM). Ahora, suponga que 8 procesos cada intento de VirtualAlloc (MEM_COMMIT) 1 GB. Resultado: el cargo de compromiso aumenta en 8 GB. ¡Sin embargo, no hay un impacto inmediato en la RAM! Es como si compraras un bloc de papel en la papelería, pero en realidad no recibiste ningún papel. Sin embargo, cada vez que necesita una nueva hoja, aparece mágicamente. Hasta que use todo el pad (el tamaño de la región asignada).
Ahora suponga que cada uno de esos procesos solo accede a 100 MB de su 1 GB. La RAM utilizada solo sería de 800 MB.
Pero dado que cada uno de ellos puede hacer referencia a todos sus 1 GB, el sistema operativo debe garantizar que 8 GB de RAM + espacio de archivo de paginación ... bueno, solo RAM en caso de que no haya un archivo de paginación ... se mantiene disponible en caso de que eso suceda . Volviendo a la papelería, necesitan mantener suficiente papel en stock para dar a todos las hojas que compraron previamente.
En consecuencia, el sistema operativo debe dejar de permitir que VirtualAlloc (MEM_COMMIT) tenga éxito cuando la cantidad actual comprometida alcanza el límite.
¿Por qué? Porque se espera que el proceso verifique el resultado de VirtualAlloc para ver si tuvo éxito. Una vez que lo haya hecho y haya encontrado que la asignación tuvo éxito, el proceso tiene todo el derecho de esperar que sus referencias posteriores a toda la región comprometida tengan éxito.
Si Windows permitió que el cargo de compromiso excediera la cantidad de espacio disponible para realizar ese espacio, entonces esa expectativa no siempre podría cumplirse.
Una solución rápida es aumentar el tamaño predeterminado (= inicial) de su archivo de página. A partir de la explicación anterior, debería poder ver por qué esto evitará el mensaje de error , aunque nunca se escriba nada en ese archivo . Nuevamente, el sistema operativo se asegura de que haya espacio disponible para todo el cargo de confirmación en caso de que lo necesite . Cuando los procesos asignan memoria comprometida, solo dicen "hey, sistema operativo, podría necesitar esto". Eso no significa que realmente lo usarán, y ciertamente no significa que realmente lo hayan usado todavía.
Para más información, mira mi respuesta aquí .
Ahora ... por qué estás usando tanto commit cuando tus procesos no parecen sumar es otra pregunta. Para comenzar a ver eso, muestre la pestaña Rendimiento del Administrador de tareas, sección Memoria.