C#的垃圾收集?
我现在正在写一项服务以自动化我的几个例程.现在,我实际上只是在过去一个月左右的时间内才开始学习C#,因此我仍然相当新(但到目前为止真的很喜欢).我已经设计了我的服务,它只是在5分钟的计时器上运行了一种方法,该计时器我通过AppSettings制作,运行一些检查,并在需要之前组织一些事情,仅此而已. . 我很快意识到我做事的最初方式似乎存在很差的内存泄漏.因此,我将其中的大部分重写以将事物嵌入"使用"块中,然后在完成后处理这些块.一个确实很有帮助的开发人员向我推荐了"使用"块,但是当他要做工作时,我不想用我的个人项目打扰他. 目前我不是真的在内存使用方面遇到问题,因为它仅使用约25MB的RAM,但是当它启动时,它仅使用约8MB,并且在每个轮询间隔时,它爬升了.但是,一旦达到25MB的阈值,我就可以看到我假设垃圾收集工作的倾角是否稍低一点,然后爬回25MB,然后冲洗并重复.因此,我的应用记忆使用量稳定,但似乎比需要的要高,所以我很好奇. 现在,如果我致电GC.Collec
2 2024-04-26
编程技术问答社区
.Net中的数据保护
我正在从客户那里得到这个问题,他们在哪里说我们在变量中进行复制或存储数据,那么有可能将数据黑客入侵,而黑客可以从RAM中获取数据并在此之前使用它GC处置它. 我们通常不将其存储在堆内存中的字符串对象中,并且当它冲洗内存时将由GC收集. 这就是我对GC 的了解 由托管堆分配的对象使用的内存超过了可接受的阈值.这个阈值是连续的 随着过程的运行进行调整. gc.collect方法被调用.在 几乎所有情况,您都不必称呼此方法,因为 垃圾收集器连续运行 是否有可能在GC冲洗之前,任何黑客都可以进入RAM并从中读取数据?如果是,那么我们如何克服它. 解决方案 如果黑客可以读取过程中的内存,则由于GC而导致的对象的不可预测的寿命是您的问题.任何语言都容易受到此类问题的影响,因为计算机有效地操纵了内存中的所有数据(无论是在gc -able堆还是其他地方 - c和汇编语言也需要将数据存储在内存中). Technologies存在(例如其他解决方案 我同意有关攻击者
4 2024-04-26
编程技术问答社区
流程结束前未完成的任务
在主线程中的代码中,我称为第三方API.对于API的每个结果,我称之为2个异步任务.有时所有工作都可以完美,有时并非所有异步任务都运行.我想,当主线程完成时,垃圾收集器杀死了我在后台运行的所有其他任务.有什么办法告诉垃圾收集者在主线程完成时不要杀死背景服务? 代码是这样的: for (int i = 0; i { DoSomething1(guid); }); } pu
2 2024-04-26
编程技术问答社区
用户如何在不改变app.config的情况下在桌面应用程序中启用后台服务器GC?
我照顾了许多用户在不同硬件上运行的WPF桌面应用程序.多个线程通过大量数据不断流动. 打开 .net框架4.5背景框架收藏显示出显着的性能改进,但是这是以更多的内存和不同CPU使用模式为代价.对于使用功能较低的机器的用户来说,这是一个潜在的问题,因此我想为最选择加入服务器GC而不是强迫所有人而受益的用户. 到目前为止,我发现启用此功能的唯一方法是 但是,大多数用户无权编辑该应用程序,因为该应用程序驻留在程序文件中,而不是本地管理员.我的理想场景将是一个友好的选项,可以通过启用服务器GC重新启动该应用程序并记住他们的选择. 所以我的问题是:有人知道采用此设置的其他方法吗? 我知道这可能是一厢情愿的想法 - 但理想情况下是在运行时动态的某些东西,或者可能是在过程上下文中设置的命令行参数或环境变量.有我已经
12 2024-04-26
编程技术问答社区
CLI原生对象被卡在gen2中而不能被垃圾收集
我正在研究这个高频生产系统.有一个C#/CLI层,该层调用C ++库.我们正在观察到的是,托管对象将进入Garabage收藏家的第二代并获得"卡住".最终,随着RAM用完,C#应用程序会停止.这些托管对象是本地对象,应该具有很短的寿命.另外,它们仅参考一次. C#应用程序必须在拥有本机资源的所有对象上调用.dispose(),以确保所有内容都被强制删除.我们有很多对象,所以这不是理想的,从API的角度来看是混乱的. CLI看起来像这样: Field::~Field() { if(m_pField != NULL) { delete m_pField; m_pField = NULL; } System::GC::SuppressFinalize(this); } Field::!Field() { if(m_pField != NULL) { delete m_pField;
12 2024-04-26
编程技术问答社区
无效的exception" nogcregion模式已经在访问GC.
我正在进行比较各种算法的性能测试,并希望由于在测试的关键阶段进行垃圾收集而消除结果中的散布.我正在使用GC.TrystartNogCregion(Long)关闭垃圾收集(请参阅 https://learn.microsoft.com/en-us/dotnet/api/system.gc.trystartnogcregion?view=net-6.0 )此后立即. 我的代码看起来像这样: long allocatedBefore; int collectionsBefore; long allocatedAfter; int collectionsAfter; bool noGCSucceeded; try
16 2024-04-26
编程技术问答社区
从命令行启动项目时,未调用.net6最终器
i在发行模式下构建.NET6控制台项目,并且从命令行最终启动时,将不会被调用.从IDE启动它的同时,成功调用了最终器. .NET Framework 4.8- CMD和IDE的最终调用 .NET CORE 3.1-未调用IDE和CMD 的最终确定器 是否应该对项目进行某些设置?或者,即使 gc.collect()是命名的? namespace TestApp { public class Program { public static void Main(string[] args) { MyClass myClass = new MyClass(); var gen = GC.GetGeneration(myClass); Console.WriteLine(gen); myClass = null;
8 2024-04-26
编程技术问答社区
这些东西存放在哪里?
我正在.net上学习GC.我想知道,我的整数,浮点或值类型,存储的静态变量,函数成员,函数中的值类型存储在哪里. 您在此主题上拥有的任何文档或任何Weblink,请在此处发布. 谢谢, Harsha 解决方案 我有从根本上讲,从可及性等方面了解垃圾收集更为重要,而不是记忆中发生的事情的实现细节. 可以在绩效方面有所帮助,但是您需要继续提醒自己这是一个实施细节. 其他解决方案 注意: jon skeet的答案更正确 stack 内存: 堆栈是为自动变量分配的内存部分. 数据使用第一个OUT(LIFO)方法中的最后一个存储在堆栈中.这意味着在存储器中仅在存储器的一端分配和划分的存储空间称为堆栈的顶部.堆栈是内存的一部分及其相关寄存器,用于临时存储信息,其中最近存储的项目是第一个被检索的. heap 内存 另一方面, heap 是用于动态内存分配的内存区域.在这种情况下,记忆块被分配和释放.直到运行时间才知道块的分配和大小的模式.程序通常被程
6 2024-04-26
编程技术问答社区
如果一个UITableViewController实例化了一个在变量中引用自己的嵌套类,它会不会被垃圾回收?
我遵循一种模式,即通过将.source属性设置为嵌套的uitaiteViewSource类的新实例,以在单触摸(xamarin.ios)中创建UitableView的模式,如下所示.另一个开发人员引起了我的关注是,由于嵌套类别通过在嵌套类构造函数中分配的_ParentController属性的嵌套类引用父级,因此这个UitableView类永远不会收集垃圾.人们的信念是,只要嵌套班级持有此参考,父级将无法收集. 任何人都可以确认这是否是真的,并且通过这种方式创建Uitable View不是一个好的编程实践,因为垃圾收集将无法释放资源? (一些方法和构造函数遗漏了简洁. public partial class MyViewController : UITableViewController { public override ViewDidLoad() { base.ViewDidLoad(); this.TableView.Source
0 2024-04-26
编程技术问答社区
C# WebAPI垃圾收集
我刚刚将我的第一个C#WebAPI应用程序交付给第一个客户.在正常负载下,最初的性能甚至比我预期的要好.最初. 一切都很好,直到有时内存,并且垃圾收集开始运行骚乱(如"收集尚未垃圾的对象"中的骚乱).那时,有多个W3WP线程,总共有十个RAM,每个工人的单位演出.重新启动IIS之后,一切都恢复了正常,但是记忆使用量再次上升. 如果我错了,请纠正我,但是 C#不应该有自动垃圾收集? GC不容易收集WebAPI应用程序的垃圾? ,请帮助我: 如何明确说明应该收集什么GC,从而防止内存泄漏? someBigList = null;要走的方式吗? 如何检测内存泄漏的位置? 编辑:让我澄清一些东西. 我的.NET WebAPI应用程序主要是一堆 public class MyApiController:ApiController { [HttpGet] public MyObjectClass[] MyApi(string someP
2 2024-04-25
编程技术问答社区
如何在API中处理文件流?
如何在API中处理文件流? 假设我需要致电此API 10次. [HttpGet("{fileName}")] public async Task Get(string fileName) { var res = File.Open(path, FileMode.Open); var file = File(res, "application/zip", fileName); return file; } 我在从API方法返回之前无法处理流. 当我第二次称呼它时,我会得到例外: 该过程无法访问文件'c:\ test \ example.zip',因为它是 被另一个过程使用. 解决方案 首先,请记住并发和线程安全. (许多请求可以同时传递给您的控制器.在这种情况下,如果您正在编写SOM,则对文件进行 - 应用程序的行为可能是错误的). 如果您不写入文件(仅读取),则可以为其他线程指定共享模式: usin
10 2024-04-25
编程技术问答社区
静态类中一个字段的寿命是多少?
我有一个简单的Web服务,其中我有一个静态类,它有一个静态的集合来记住活着的令牌. 我只想确保代币的收集生存,直到下一个IISRESET或应用程序池回收为止. 在应用程序袋和静态类中记住状态有什么区别? 谢谢, 解决方案 Microsoft( say ): ) ASP.NET包括应用程序状态,主要是为了与经典ASP兼容,因此将现有应用程序迁移到ASP.NET更容易.建议您将数据存储在应用程序类的静态成员中,而不是在应用程序对象中.这会提高性能,因为您可以比访问应用程序字典中的项目更快地访问静态变量. 因此,使用静态变量.并且不要忘记使用lock. 其他解决方案 您的静态成员不会扩展到超过1服务器.
2 2024-04-25
编程技术问答社区
为什么c#/xna中的垃圾收集不能自动处置渲染目标?
我发现C#/XNA中的渲染目标不是自动处置的,您必须调用.dispose()成员才能摆脱它们. 我以为垃圾收集在所有参考文献消失后会自动摆脱东西,什么给了? 还有其他没有自动处理的其他东西吗? 解决方案 我以为垃圾收集在所有参考文献消失后会自动摆脱东西,什么给了? 这两种方式是不正确的. 垃圾收集收集托管内存可以安全收集,需要.就是这样. 将垃圾收集视为模拟无限堆内存的一种方式.由于我们可以假装自己有无限的内存,因此我们永远不必打电话给使用的任何东西来免费使用,因为我们为什么要保留无限的资源?* GC模拟无限堆的最简单方法是什么都不做.当例如该过程具有4GIB可用的可用内存,并且使用50MIB.收集永远不会出现.如果应用程序足够小,以至于收集永远不会发生,这确实会发生. (尽管这并不是懒惰,以至于让您在没有集合的情况下使用MEGS,但它会尝试在询问OS提供更多内存之前尝试收集该应用程序,但当您想知道"为什么不'GC"时,它仍然很有用. ..
4 2024-04-25
编程技术问答社区
为什么GC不收集一个未使用的对象
我试图了解当对象不再使用时GC的行为是如何行动的,我的测试是对对象无能(使用后),但它行不通,但它不起作用,对象的破坏者从未被调用. 我已经创建了一个示例程序,试图等到对象被破坏,但是在运行4个小时后,什么也没发生. 注意:我知道是否设置了对象将GC收集为无效,但是我只想看到GC本身收集对象的"正常"方式. using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { internal class Program { private const string FilePath = @"C:\objLifeCycle.txt"; private static void Main(strin
0 2024-04-24
编程技术问答社区
我的程序在GC进行垃圾回收时崩溃了
我的程序遇到了麻烦:当GC执行垃圾收集时,我的程序总是以一个函数崩溃,在 之前,Main Flow调用了几次 崩溃,此功能的第一行是gc.collect().功能主操作将一些字节发送到串行端口并从 接收一些字节 相同的串行端口(每次发送和接收字节都低于256个字节).gc.collect()调用用于定位崩溃点,将在 中删除. 发行版. 我不知道确切的原因,但是我知道程序崩溃的确切功能. 我该怎么做? 善良的响应将被赞赏! 真诚的, jizhiguo 电子邮件:jizhiguo@gmail.com ps: 环境:winxp(sp3),VS2005,.NET 2.0,C#,Oracle 10G 以下是我的windbg跟踪信息: *注意:IFDMGR和NSIISYS的名称空间是我自己的创建. --------------------------WinDbg tracing info ------------------------
12 2024-04-24
编程技术问答社区
如何用NetworkStream正确处理传入的protobuf消息?
使用TCPCLIENT的NetworkStream和Protobuf-net我通过TCP发送和接收ProtoBuf消息.接收是通过以下方法在自己的线程中运行的: private void HandleClientComm() { using (NetworkStream stream = m_Stream) { object o; while (true) { if (stream.CanRead && stream.DataAvailable) { o = null; if (Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, Utilities.CommunicationHelper.resol
2 2024-04-24
编程技术问答社区
如何通过处置静态方法来防止故障(内存泄漏)?
我正在使用asp.net 4.0. 从最近几周开始,很少有用户抱怨应用程序开始出现故障. GridView突然开始显示下拉列表控件的内容,即当天的任何时间点可能访问了同一用户或另一个并发用户.同样,下拉控件可能会被任何旧结果集的RowID而不是实际项目填充. 我遇到了一篇文章:用户在asp.net中查看其他用户数据作者在其中讨论负责内存泄漏行为的静态对象. 它使我想起了我的项目中的一个Static的课程,并包含public static方法.此类包含填充下拉列表的方法,返回查询输入的数据集或根据查询输入返回标量对象. 此类的提取物如下: public static class reuse { public static void FillDropDownList(string Query, DropDownList DropDownName, string ConnectionStringParameter) { SqlDat
0 2024-04-24
编程技术问答社区
垃圾收集器的行为
i使用C#(与XNA 4和单组).我使用内容管理器的Load()方法加载资产(纹理,音频).当不再需要这些资产时,如何从内存中正确Unload()它们? 我假设,一旦对加载资产的所有引用被覆盖(或设置为null),则资产将由垃圾收集器自动删除.这是正确的还是由于资产是通过ContentManager加载的事实,资产是否仍然锁定? 是否有必要调用'contentManager.unload()'发布特定CM的资产? 解决方案 是的,如果您希望内容管理器中的资产完全从内存中卸载,则必须调用Unload().除了清除内容管理器的内部缓存(其中包含您已加载的所有内容的引用)之外,它将在任何实现IDisposable的资源上调用Dispose(). 请注意,A ContentManager维护内部资源的原因是因为两次加载相同的资源并不是 load load 相同的资源两次:第二次,它将简单地交手您是缓存的对象参考.
8 2024-04-24
编程技术问答社区