【问题标题】:Control amount of memory in a thread C#控制线程 C# 中的内存量
【发布时间】:2020-07-13 20:57:34
【问题描述】:

如果达到特定数量会导致线程下降,是否可以控制方法中使用的内存量?

我遇到了一个偶尔会产生内存泄漏的问题,如果发生泄漏我想关闭线程。

这个问题来自第三方组件,直到他们修复它我想要一个解决方案。

【问题讨论】:

  • 我不知道这是否可能:您要求的内容与管理 CPU 内部的内核代码有关......所以也许有一些 WinAPI 可用。例如,在 x64 中,每个进程都有 2GB 的可用虚拟内存。我不知道现代 CPU 是否允许定义线程颗粒度。发现:content.atalasoft.com/atalasoft-blog/…
  • 简短回答:不。内存不是按线程分配的,而是按应用程序域分配的。而且,它是托管内存,所以垃圾收集器负责。 “偶尔会产生内存泄漏的问题”是什么意思?你觉得你正在泄漏托管内存吗?您所说的组件是否使用“非托管”内存(通过 P/Invoke 或 COM)?
  • 您要解决的问题是什么?
  • @Sean 我正在尝试修复来自 Microsoft.Azure.Storage.Blob 的上传文件。如果我发送一个非常大的文件,它会开始扩展内存,直到它丢弃机器。在 .net 2.2 中,所有尝试都会下降,当使用 GC.Collect 时,我可以在不上传内存的情况下上传高达 3MB 的较大文件,而在尝试 9MB 文件时它会下降。在 3.1 中,它以较低的频率出现。但在生产方面,我不能冒险让错误发生。

标签: c# memory-leaks threadpool


【解决方案1】:

简短回答:不。内存属于进程(通常)或在 .NET 中至少属于 AppDomain。 CPU 时间属于线程。

长答案:

a) 有ThreadLocalStorage,用于存储与线程相关的内容。在 .NET 中,它是 ThreadLocal<T>。但是由于你不能修改这个库,所以它不会使用它。

b) 如果您实现自己的内存管理,您可能会检查分配了哪些线程内存。它seems possible,但我不会推荐它。这对于 C 和 C++ 来说更重要,您可以轻松地在 newmalloc() 上使用 #define 来覆盖堆上的内存分配方式。

c) 如果您的库是本地库(或本地库的包装器),那么 b) 也是无用的,因为内存分配将采用不同的方式。

【讨论】:

  • 嗯,堆栈空间和线程本地存储除外。
  • @Blindy: 是和否 :-) 只要一个线程知道另一个线程堆栈的地址,它就可以访问它。所以它不属于一个线程。
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
相关资源
最近更新 更多