me escribió este pequeño programa de prueba:uso de la memoria de cuerdas (o cualquier otro objeto) en .Net
using System;
namespace GCMemTest
{
class Program
{
static void Main(string[] args)
{
System.GC.Collect();
System.Diagnostics.Process pmCurrentProcess = System.Diagnostics.Process.GetCurrentProcess();
long startBytes = pmCurrentProcess.PrivateMemorySize64;
double kbStart = (double)(startBytes)/1024.0;
System.Console.WriteLine("Currently using " + kbStart + "KB.");
{
int size = 2000000;
string[] strings = new string[size];
for(int i = 0; i < size; i++)
{
strings[i] = "blabla" + i;
}
}
System.GC.Collect();
pmCurrentProcess = System.Diagnostics.Process.GetCurrentProcess();
long endBytes = pmCurrentProcess.PrivateMemorySize64;
double kbEnd = (double)(endBytes)/1024.0;
System.Console.WriteLine("Currently using " + kbEnd + "KB.");
System.Console.WriteLine("Leaked " + (kbEnd - kbStart) + "KB.");
System.Console.ReadKey();
}
}
}
La salida en la versión de lanzamiento es:
Currently using 18800KB.
Currently using 118664KB.
Leaked 99864KB.
Asumo que el GC. la llamada de cobro eliminará las cadenas asignadas ya que salen del alcance, pero parece que no lo hace. No entiendo ni puedo encontrar una explicación para eso. Quizás alguien aquí?
Gracias, Alex
¿Es cierto que llamar a 'GC.Collect' puede o no hacer una recolección de basura dependiendo de alguna variable oculta? –
@Phil: No diría que se basa en una "variable oculta", pero no está garantizado que realmente haga la colección ahora. Es una solicitud en lugar de una orden, si se quiere. –