.Net ¿Por qué no puedo obtener más de 11 GB de memoria asignada en un proceso x64?
process memory-management (4)
Pensé que el espacio de usuario máximo para un proceso de 64 bits era de 8 TB, pero hice una pequeña prueba y el máximo que pude obtener fue de 10-11 GB.
Nota: no necesito tanta memoria en un proceso, solo quiero entender por qué por curiosidad.
Aquí está mi programa de prueba:
static void Main(string[] args)
{
List<byte[]> list = new List<byte[]>();
while (true)
{
Console.WriteLine("Press any key to allocate 1 more GB");
Console.ReadKey(true);
list.Add(new byte[1024 * 1024 * 1024]);
Console.WriteLine("Memory size:");
double memoryUsage = Process.GetCurrentProcess().PeakVirtualMemorySize64 / (double)(1024 * 1024 * 1024);
Console.WriteLine(memoryUsage.ToString("0.00") + " GB");
Console.WriteLine();
}
}
EDITAR:
Se actualizó el programa de pruebas para ser más determinista.
Para aceptar una respuesta, me gustaría saber cómo se calcula la memoria máxima asignada real si 8TB es solo teórico.
Es hasta 8 TB, no 8 TB. Puede tener potencialmente hasta 8 TB, pero necesita la RAM / swapfile correspondiente.
Es tu maquina
Tengo un x64 con 8GB de RAM y un archivo de paginación de 12GB, y ejecuté su programa y superé los 16.23GB.
EPÍLOGO : Luego, mi instalación de Win7 se deslizó gradualmente en coma, ya que los procesos críticos aparentemente se habían quedado sin memoria.
EDITAR : Si desea comprender cómo Windows asigna (es decir, reserva y confirma) la memoria, lea esto: http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx y esto: http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx
Como .Net depende de Windows para administrar la memoria que usa para construir el montón del GC, la mecánica de cómo Windows hace esto se refleja en cómo se asigna la memoria en .Net en un nivel bajo.
Intente asignar una porción (en lugar de una lista de porciones de 1MB):
Dim p As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(New System.IntPtr(24 * (1024 ^ 3)))
Edición : dado su comentario, que solo tiene 4GB de RAM física, realmente no tiene negocios asignando> ~ 8GB e incluso eso lo está impulsando.
Editar -
Para aceptar una respuesta, me gustaría saber cómo se calcula la memoria máxima asignada real si 8TB es solo teórico.
La cantidad máxima de RAM que puede asignar es probablemente equivalente a (Tamaño de archivo de página - Tamaño de todo en la RAM, excepto el que no puede o no se paginará) + (Tamaño de RAM física - Tamaño de todo lo que no puede o no se paginará, es decir, lo que se necesita para que su sistema siga funcionando ... kernel, controladores, cosas .net, etc ...)
Por supuesto, el archivo de la página puede crecer ...
Tarde o temprano, la paginación a / desde el disco se convierte en mucho y su sistema se ralentiza y se vuelve inutilizable.
Lea el blog de Mark Russinovich:
Supongo que es porque estás usando una Lista, que creo que tiene un límite interno.
Vea lo que puede obtener si intenta algo como crear su propia lista de la vieja escuela:
public class ListItem<T>
{
public ListItem Parent;
public T Value;
public ListItem(ListItem<T> parent, T item)
{
this.Parent = parent;
this.Value = item;
}
}
He escrito casi ese código exacto anteriormente (solo mi artículo era un int) y lo ejecuté en una máquina con 32 procesadores y 128 GB de RAM, siempre se eliminó en el mismo tamaño sin importar qué, y siempre fue algo relacionado con Int32 .MaxValue, espero que ayude.