1

在我的 C# 控制台应用程序中,我实例化了一个 MyType 类型的对象 MyObject。该对象包含 6 个非常大的数组,其中一些包含原始类型的元素,另一些包含其他引用类型的元素。后者又可以包含大数组。为了实例化所有这些数组,我做了一些密集的处理,持续大约 2 分钟。

我正在使用的机器有 4 GB RAM,在 32 位 Windows 上。在运行我的控制台应用程序之前,可用内存约为 2413 MB,在完成之前,可用内存约为 300-400 MB。

在我为对象 MyObject 中的所有数组分配值后,我将对其进行序列化。我的目标是实例化和序列化 50 个像这样的对象。所以在序列化之后,我将所有数组都设置为空。[这不会立即反映在任务管理器中,可用内存仍然是 300-400 Mo。所以我假设 GC 不会立即收集。] 此后,我正在重新执行在 MyObject 中实例化数组的方法。我几乎立即得到系统内存不足异常。我认为这不是在.NET 中有效管理内存的正确方法。

所以我的问题是:知道处理一个 MyType 类型的对象,如 MyObject,“适合”可用内存资源,我如何实例化一个 MyType 类型的对象,序列化它,然后完全清理所有用于这个目的?然后,要么重新实例化同一个对象,要么重新实例化一个相同类型的新对象?所以我最终得到了 50 个不同的 MyType 类型的序列化对象?

谢谢。

用代码更新问题。这是我的代码的简化版本:

class MyType
{
    int[] intArray; int[] intArray2;
    double[] doubleArray; 
    RefType1[] refType1Array; 
    RefType2[] refType2Array;
    RefType3[] refType3Array;

    public MyType (params)
    {
        for (int i = 0; i < 50; i++)    
        {    
            instantiateArrays();
            serializeObject();
            releaseMemory(); 
        }
    }                            

    private void instantiateArrays()
    {
        //instantiate all the primitive arrays with 50.000 elements per array
        //instantiate refType1Array with 300 elements, refType2Array with 3000 elements and 
            //refType3Array with 150 elements
        //lasts about 2 minutes
    }

    private void serializeObject()
    {
        Stream fileStream = File.Create(filePath);
        BinaryFormatter serializer = new BinaryFormatter();
        serializer.Serialize(fileStream, this);
        fileStream.Close();
    }

    private void releaseMemory()
    {
        intArray = null;
        intArray2 = null;
        doubleArray = null;
        refType1Array = null;
        refType2Array = null;
        refType3Array = null;
    }
}

RefType1 包含整数和双精度字段,以及另一个平均有 50 个元素的整数数组。RefType2 和 RefType3 包含整数和双精度字段,以及另一个引用类型 RefType4 的数组。平均而言,该数组包含 500 个对象。每个 RefType4 对象平均包含一个由 15 个整数组成的数组。

4

1 回答 1

0

您可以通过以下命令清理内存:

 GC.Collect();
 GC.WaitForPendingFinalizers();
于 2013-06-30T08:17:36.497 回答