c# - 如果永远不会使用引用,持有对对象的引用是否会将其保留在内存中?

标签 c# garbage-collection clr

我有一个对象的 WeakReferences 集合。 对象在运行时动态加载,可以被GC随机回收。

有时,我需要永久删除一个对象,这是通过异步 DB 命令完成的。 含义 - 在删除命令和在持久性数据库中实际提交删除之间有一个时间段,在该时间段中可以对对象进行 GC,然后从数据库中重新加载。

我解决这个问题的最简单方法是在每个对象(已经有一个)中有一个“已删除”标志,并且在执行删除操作时,将对已删除对象的强引用添加到 DB Command 对象,所以当操作完成时,强引用丢失,对象可以永远释放。

问题是,是否允许 GC 以预读方式收集我的对象?它适用于这种情况吗? 我是否保证在 DB 命令出队和处理之前不会收集该对象?

这里是一些较低级别的细节:

Dictionary<Int64, WeakReference> mItems;
struct IOCommand
{
    public CommandDetails command;
    public object[] strongReferences;
}
Queue<IOCommand> mIOQueue;
void queueCommand(CommandDetails command, object relatedObject)
{...}

您可以看到,在对命令进行排队时,我将相关对象作为强引用传递到队列中,直到它被处理为止,但是由于未使用该对象,问题是它们是否可以被优化掉...

阿米特。

最佳答案

只要您的代码有一个对象的(非弱)引用,它就不会被收集。

所以你应该是安全的,( future 的)Db 命令将使用引用这一事实确保它仍然存在。

只要确保您在这种情况下不依赖弱引用,强引用应该有适当的生命周期。


but as the object are not used the question is can they be optimized away...

没有。您存储它们的方式将确保它们存在,只要命令存储在队列中,当然只要队列是可访问的。

但请注意,如果它们真的不被使用,那应该无关紧要......

关于c# - 如果永远不会使用引用,持有对对象的引用是否会将其保留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471817/

相关文章:

c# - 将窗口保持在前台(即使它失去焦点)

c# - 在哪里存储连接字符串

.net - 删除boo中的一个变量

java - 没有垃圾回收的 JVM

.net - 在第三方 .NET 程序集上更改平台目标

c# - 即使在部署后也从不同的文件夹引用 dll

c# - 我应该在我的接口(interface)上公开 IObservable<T> 吗?

c# - 这个 Timer 会从内存中释放吗?

.net - 哪些设计决策导致 StackOverflowException 在 .NET 2.0+ 中无法捕获?

Python 获取 IDE linter 以从 pythonnet 的 clr 中的系统导入中查看