gpt4 book ai didi

c# - 抑制 GC 内存优化

转载 作者:行者123 更新时间:2023-11-30 19:43:46 24 4
gpt4 key购买 nike

我正在编写一个程序,在多个线程中调用多个基于 C 的函数 (p/Invoke)。

有时,程序会因访问冲突错误而崩溃。我的第一个想法是 GC 优化了内存并将 C 函数正在处理的内存块移动到不同的位置。

我想做的是让 GC 正常工作,但禁用它移动(碎片整理)内存的部分。

有办法吗?

最佳答案

正如其他答案所说,首先要做的是确保正确固定对象。假设您已经这样做了,还有什么地方会出错?

class C
{
public int handle;
...
~C() { InteropLibrary.DestroyHandle(handle); }
}

void M()
{
C c = GetSomeObjectUsefulInUnmanagedCode();
D d = InteropLibrary.UnmanagedMethodThatUsesHandle(c);
// COMMENT
d.DoSomethingWithStoredHandle();
}

如果在 COMMENT (*) 发生垃圾回收怎么办?垃圾收集器可以自由地说“嘿,局部变量 c 再也不会在这个方法中被引用;我可以主动将它视为已死!”。如果终结器运行并且句柄被销毁,那么当最后一个方法运行时,它会访问一个被销毁的句柄并崩溃。

要解决这个罕见但可能发生的问题,您可以使用 GC.KeepAlive 告诉垃圾收集器不要那么积极地清理特定引用。如果你让 c 一直存活到方法结束,那么你就知道它的析构函数不可能运行。


(*) 当然,GC 运行在不同的线程上,并且可以随时运行。 GC 可中断和不可中断的操作的详细信息很复杂,您不应该依赖这些实现细节来确保正确性。

关于c# - 抑制 GC 内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com