Process.GetProcessesByName (String, String) Pérdida de memoria

Tengo un código que obtiene una lista de procesos en una computadora remota utilizando el método estáticoProcess.GetProcessesByName (String, String), esto se ejecuta en muchas computadoras (unos pocos miles) y he notado que es la causa de una pérdida importante de memoria.

Ejecuté el generador de perfiles de memoria ANTS que me dijo que la mayoría de mi memoria está ocupada por cadenas, cadenas que contienen valores de cadena como "% de tiempo de inactividad", "Información del procesador" y "Errores de caché por segundo". He reconocido que esas cadenas probablemente forman parte de los Contadores de rendimiento en el programa, el problema es que no tengo ningún contador de rendimiento en el programa.

Examinando más a fondo descubrimos que esas cadenas se mantienen en tablas hash mantenidas por PerformanceCounterLib que son mantenidas por OTRA tabla hash que se almacena dentro de un miembro interno estático de la clase PerformanceCounterLib (que en sí mismo es interno).

Al profundizar aún más en el agujero del conejo, descubrí que Process.GetProcesesByName usa PerformanceCounterLib para ejecutar la lista de procesos en una computadora distante y que para cada computadora remota se crea y hace referencia a otra instancia de PerformanceCounterLib en la variable interna estática de PerformanceCounterLib. Cada una de esas instancias tiene ese hashtable de cadenas que descubrí que está obstruyendo mi memoria (cada una de ellas tiene entre 300 y 700 kb, lo que significa que está obstruyendo mi montón de objetos grandes).

No encontré una forma de eliminar esas instancias de PerformanceCounterLib no utilizadas, todas son internas y el usuario no tiene acceso a ellas.

¿Cómo puedo solucionar mi problema de memoria? Esto es REALMENTE malo, mi programa alcanza los 5GB (límite de mi servidor) en 24 horas.

EDITAR: agregó un fragmento de código (no probado) que debería reproducir el problema. Para aclarar:

/// computerNames is a list of computers that you have access to
public List<string> GetProcessesOnAllComputers(List<string> computerNames)
{
    var result = new List<string>();
    foreach(string compName in computernames)
    {
        Process[] processes = Process.GetProcesses(compName); // Happens with every     method that gets processes on a remote computer
        string processString = processes.Aggregate(new StringBuilder(), (sb,s) => sb.Append(';').Append(s), sb => sb.ToString());
        result.Add(processString);
        foreach (var p in processes)
        {
            p.Close();
            p.Dispose();
        }
        processes = null;
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta