【问题标题】:Thread failed to start C# due to low virtual memory condition由于虚拟内存不足,线程无法启动 C#
【发布时间】:2018-09-08 14:19:42
【问题描述】:

今天我的客户在运行我的应用程序时收到错误(如下)

ERR::-2146233051:线程无法启动。在 System.Threading.Thread.StartInternal(IPrincipal 主体, StackCrawlMark& stackMark) 在 System.Threading.Thread.Start()

=========

如您所见,它表明创建线程失败。用于创建线程的代码

//-state -> stateobject for receving socketdata

objState.m_strReceivedData = state.m_strReceivedData;
objState.m_strComputerName = state.m_strComputerName;

objThread = new Thread(new ParameterizedThreadStart(MethodName));
                            objThread.Start(objState);

根据错误,上面的代码似乎发生了错误。此外,在事件查看器中,内存不足的警告表明我的 exe 正在使用最多的虚拟内存。以下是我在事件查看器中收到的消息。

Windows 成功诊断出虚拟内存不足的情况。以下程序消耗最多的虚拟内存:application.exe (4272) 消耗 32793702400

我认为有内存泄漏,所以我应该强行调用 GC.Collect() 或者还有其他选择吗..?

请指教!我在这里先向您的帮助表示感谢。 :)

【问题讨论】:

  • 调用 GC 不是好的和标准的选择。使用诸如“MemProfiler”之类的内存分析器来检测内存泄漏。
  • 添加@MojtabaTajik 评论,GC 足够智能,可以在系统内存不足时自动触发。所以在这种情况下强行打电话不会改变任何事情

标签: c# multithreading memory-leaks threadpool


【解决方案1】:

请按照以下步骤减少内存消耗:

1.如果创建和使用对象并且您不需要它进一步使其为空。

2.不要保持加载不必要的数据/不要尝试一次加载大量数据

喜欢 1.) 从文件中读取大量数据 2.) 从数据库中读取的海量数据

3.当你不使用块中的对象时,不要在块中提及它,这样GC很容易快速收集它。

4.例如不包含相同数据对象的副本

  public class Student
    {
       string Name;
       string ID;
    }

如果为此创建了两个具有相同数据的对象

学生 1 { 名称: ramu, 编号:40 }

然后您创建了另一个具有相同数据的对象 student2

学生2 { 名称: ramu, 编号:40 }

现在即使它是不同的对象,但它是数据的重复

哪一个会占用内存

if student1=2mb
then student2=2mb
total 4mb for maintaining same data

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 2012-02-01
    • 2016-11-29
    • 2012-07-03
    • 2019-12-02
    • 2013-01-30
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多