【问题标题】:Remove Class/Variable Instance from memory (completely) [closed]从内存中删除类/变量实例(完全)[关闭]
【发布时间】:2026-01-14 12:15:01
【问题描述】:

我正在使用 c# (.NET) 开发一个套接字项目。我正在处理一些类(数据包)的数据。当我查看数据传入时的内存使用情况时,它正在上升!即创建类。如何从内存中删除(手动)类和未使用的变量/类(不使用 GC!)?

如果我尝试仅接收数据之类的基本操作,它会再次上升。此时,我想完全从内存中删除/删除类/变量!

有人可以帮忙吗?

【问题讨论】:

  • 我不确定我是否理解。 GC 删除未使用的对象。如果您不想使用它,我认为您会被困在编写非托管代码并自己动手做。

标签: c# class memory memory-management instance


【解决方案1】:

你不能。您无法在 C# 中手动删除对象。如果垃圾收集器没有自动执行此操作,那么您很可能在某处持有该对象。使用分析器找出位置并修复您的代码。

【讨论】:

  • 我正在使用数组列表(或字典)中的数据包。如果数据包被处理,即如果它被处理,我想从内存中删除它。我已经从 ArrayList(或字典)中删除了它。
  • @freaka61:那么,如果没有其他东西保留它,它最终被垃圾收集。您无法将其从内存中删除。它只是不会发生。你需要接受这一点。 (还有,你为什么还在用ArrayList?)
【解决方案2】:

无法手动执行此操作的好处和痛苦(在某些情况下)。即使强制 GC.Collect() 您也不能保证获得空闲内存。

另外,内存清理请求是一个请求,因此可能会延迟一些时间,而不是立即发生。

所以在CLR如果我们谈论.NET 对象分配,清理内存的唯一方法是:清理你的对象,让它们没有其他对象指向它们,和

  • 等到GC 收集它们,如果会(取决于代)

  • 手动调用GC.Collect(),不建议使用,但也可以使用,顺便不保证会清理内存。

进一步阅读:what are the Generations in Garbage Collection?

【讨论】:

  • 也就是说,我只能这样做:1:从arrayList中删除对象,2:将其设置为“null”。对? :L
  • @freaka61:设置什么为空?没有将对象设置为 null 的概念 - 仅将变量值设置为 null。如果您还没有一个变量来保存对该对象的引用,您打算将什么设置为 null?
  • @JonSkeet err,如何删除实例化类? (GC怎么能去掉呢?)
  • @freaka61:你没有删除它。 GC 会在需要时将其删除。如果您认为您的对象被保留的时间过长,请使用分析器来确定其他对象是否引用了它。我不确定我们还能用多少种方式说同样的话。
  • @freaka61:清理数组就足够了,并确保程序中没有其他人指向它的实例。迟早应该被收集起来。