【问题标题】:way to release memory in C#C#中释放内存的方法
【发布时间】:2014-07-04 18:58:24
【问题描述】:

我从串口中读取字节[]中的数据,然后在richtexbox中以十六进制字符串显示。

private string ByteArray_to_Hex(byte[] data) {
    StringBuilder sb = new StringBuilder(data.Length * 3);

    foreach (byte b in data) {
        buffer_log.Add(b); // save data in buffer to write to file
        sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
    }

    GC.Collect();
    return sb.ToString().ToUpper();
}

private void Log(string msg) {
    try {
        Richtexbox.Invoke(new EventHandler(delegate {
            Richtexbox.AppendText(msg);
            if (Richtexbox.Text.Length > 1000000) {

                // seem to slow when comparing to amount of data reading
                Richtexbox.Select(10000, 950000); 
                Richtexbox.SelectedText = "";
            }
        }));
    } catch {
    }
}

private void PLay_Click()
{
    Log(ByteArray_to_Hex(data_come_from_serialport);
}

由于有很多文本,它会消耗大量内存。但是当我打电话时

private void menu_Clear_Click(object sender, EventArgs e) {
    Richtexbox.Clear();
    buffer_log.Clear();
    GC.Collect();
}

它不是释放内存,仍然消耗大量内存。释放这些内存的最佳方法是什么?

更新:

因为这是最好的方法。这是什么问题。我描述了我遇到的问题: 此应用程序在运行 1 小时时总是出现 systemoutofmemory 异常。 如果我运行这个应用程序 55 分钟然后调用 Clear 方法,它只能工作 5 分钟并且有 systemoutofmemory 异常。有人可以解释一下吗?

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (!SerialPort.IsOpen)
            {
                return;
            }
            if (flag_stop)
            {
                return; 
            }
            int bytes = SerialPort.BytesToRead;
            byte[] buffer = new byte[bytes];
            SerialPort.Read(buffer, 0, bytes);
            Log(ByteArray_to_Hex(buffer));
        }   

更新从串口读取数据的方式。

【问题讨论】:

  • 什么都不做。在几乎所有情况下,这都是最好的方法。你的情况也不例外。几乎可以肯定,您会误解任何信息告诉您它正在使用“大量”内存。
  • 我在任务管理器中看到这个应用程序在运行前后使用的内存(一个小时然后调用 Clear 方法)。
  • 任务管理器是衡量内存使用率的不好方法。除其他外,它显示的是虚拟内存,而不是物理内存。
  • 您对自己工作的环境缺乏基本的了解:它是托管的。你不管理内存..环境可以。
  • 因为这是最好的方法。这是什么问题。我描述了我遇到的问题:

标签: c# .net c#-4.0 memory memory-management


【解决方案1】:

您不需要做任何事情。这就是托管代码的魔力。

但是你想尝试触发你可以使用的垃圾收集器。

    GC.Collect();
    GC.WaitForPendingFinalizers();

但请阅读此first 然后this 最后是干的boring msdn text

【讨论】:

  • 可能更好的 GC.Collect(2);为所有代运行垃圾收集
  • 有用,但在这里找不到解决我的问题的方法。
  • 我现在没有看到你的编辑单元。如果你的机器像这样占用内存,GC 将被触发。但是 GC 已经决定它不能释放内存......这意味着你必须引用一些缓冲区或者没有正确清理。尝试注释掉所有内容。然后一一重新引入函数。
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 2019-04-21
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
相关资源
最近更新 更多