如何恢复程序的内存使用情况

本文关键字:用情 情况 内存 恢复程序 | 更新日期: 2023-09-27 18:21:54

我正在创建一个使用大量内存的应用程序。当我完成计算时,程序仍然具有高内存,正如我在任务管理器中注意到的那样。

如何重置程序的RAM内存使用率?

我正在创建一个大数组,在其中存储MB的随机字符。然后将所有字符打印到一个变量中,然后将变量的内容写入文件中。

namespace Fake_File_Creator
{
    public partial class MainWindow : Form
    {
        private string text;
        private List<char> stringChars;
        public MainWindow()
        {
            InitializeComponent();
        }
        private void btnNewFile_Click(object sender, EventArgs e)
        {
            sfdNewFile.Filter = "All Files|*.*";
            if (sfdNewFile.ShowDialog() == DialogResult.OK)
            {
                lblMessage.Text = "Generating data...";
                bwCreateData.RunWorkerAsync((int)nudSize.Value * 1024000);
            }
        }
        private void bwCreateData_DoWork(object sender, DoWorkEventArgs e)
        {
            var random = new Random();
            var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 ~!@#$%^&*()_+ /.,'[];{}|:<>?";
            stringChars = new List<char>();
            for (int i = 0; i < (int)e.Argument; i++)
            {
                stringChars.Add(chars[random.Next(chars.Length)]);
            }
            text = new string(stringChars.ToArray());
        }
        void bwCreateData_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            lblMessage.Text = "Saving file...";
            bwCreateFile.RunWorkerAsync();
        }
        private void bwCreateFile_DoWork(object sender, DoWorkEventArgs e)
        {
            using (StreamWriter outfile = new StreamWriter(sfdNewFile.FileName))
            {
                outfile.Write(text);
            }
        }
        void bwCreateFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            lblMessage.Text = "File succesfully created...";
            text = string.Empty;
            stringChars.Clear();
            stringChars.TrimExcess();
        }
    }
}

如何恢复程序的内存使用情况

对此您无能为力。当垃圾回收发生时,未使用对象消耗的内存将被释放。而且你不能强迫垃圾收集。你可以在MSDN上阅读更多关于它的信息,也可以查看GC类

MSDN 中的示例

private const long maxGarbage = 1000;
static void Main()
{
    MyGCCollectClass myGCCol = new MyGCCollectClass();
    // Determine the maximum number of generations the system
    // garbage collector currently supports.
    Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);
    myGCCol.MakeSomeGarbage();
    // Determine which generation myGCCol object is stored in.
    Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
    // Determine the best available approximation of the number 
    // of bytes currently allocated in managed memory.
    Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
    // Perform a collection of generation 0 only.
    GC.Collect(0);
    // Determine which generation myGCCol object is stored in.
    Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
    Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
    // Perform a collection of all generations up to and including 2.
    GC.Collect(2);
    // Determine which generation myGCCol object is stored in.
    Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
    Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
    Console.Read();
}
void MakeSomeGarbage()
{
    Version vt;
    for(int i = 0; i < maxGarbage; i++)
    {
       // Create objects and release them to fill up memory
       // with unused objects.
       vt = new Version();
    }
}

具有资源的类型应该实现IDisposable,释放这些资源是通过调用Dispose(或将它们封装在using语句中)来完成的。GC.Collect仅对具有资源但不实现IDisposable的对象是必需的。

您不能强制GC

但是,如果您想在完成数组后立即释放内存。

//I assume stringChars is the array
stringChars.Clear();
stringChars = null; 
GC.Collect(); 

这取决于您想要释放的内存类型。真的在调用GC.Collect();可能不起作用。为什么?

  1. 它收集对象,但您不知道哪些对象。你的物体很大。通常垃圾收集器不收集大对象,或者很少收集(但很少用于机器时间测量,而不是用于人类)。

  2. 分配给阵列的虚拟内存很可能不会释放给操作系统。因为虚拟机内存管理器通常会重用释放的内存。它们还执行内存的预分配。它们分配一大块内存,然后使用它。这允许不执行大量系统调用来为新对象获取内存,因为.NET语言通常会创建大量内存(在C++中,复制被大量使用,堆与.NET内存管理器相比是"伪"的)。