创建枚举后销毁 EnumBuilder?
我正在尝试减少应用程序使用的内存量。 在我的应用程序中,我使用 System.Reflection.Emit.EnumBuilder 根据运行时收到的信息动态创建枚举。 我只使用 EnumBuilder 创建一个单独的枚举,之后就不再使用它了。 在使用 CLRProfiler 时,我注意到 EnumBuilders 永远不会被破坏。 我的应用程序在运行时可以进行数千次枚举,因此这些 EnumBuilder 使用的内存量可能会增加。 EnumBuilder 没有定义 Dispose 方法,因此我无法以这种方式销毁它。 是否有可能以某种方式从内存中删除剩余的 EnumBuilder?
I am trying to reduce the amount of memory my application uses. In my application, I use System.Reflection.Emit.EnumBuilder to create enumerations on the fly from information I receive at runtime. I only use the EnumBuilder to create an individual enumeration, and after that I have no further use for it. While using CLRProfiler, I noticed that the EnumBuilders are never destroyed. My application can make thousands of enumerations while running, so the amount of memory used by these EnumBuilders can add up. EnumBuilder does not define a Dispose method, so I cannot destroy it that way. Is it possible to somehow remove leftover EnumBuilders from memory?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
EnumBuilder
在动态程序集中创建枚举。 根据如何:加载和卸载程序集 (C# 编程指南),如果不卸载使用该程序集的所有应用程序域,就无法卸载该程序集。 特别是:“即使程序集超出范围,实际的程序集文件也将保持加载状态,直到包含它的所有应用程序域都被卸载。”
EnumBuilder
creates the enumeration in a dynamic assembly. According to How to: Load and Unload Assemblies (C# Programming Guide), there's no way to unload an assembly without unloading all app domains that use it. In particular:"Even if the assembly goes out of scope, the actual assembly file will remain loaded until all application domains that contain it are unloaded."
为什么? 听起来你正在做一些你可能不应该做的事情。
Why? It sounds like you are doing something that you probably shouldn't be doing.
我也注意到了同样的情况。 这是 ModuleBuilder 中的一个“泄漏”,它保留在字节和字符串 IIRC 上。
您可以在加载了 SOS 的 WinDbg 中查看以获得更好的内存信息。
I have noticed the same. It's a 'leak' in ModuleBuilder that hangs on to the bytes and strings IIRC.
You can have a look in WinDbg with SOS loaded for better memory info.