我所处的情况是,我必须一次创建数千个对象,实例化对象和垃圾收集它们的成本正在影响应用程序的性能,而垃圾收集器运行的影响对性能的影响更大,因为这是在较旧的硬件上,所以我主要是试图防止创建垃圾。我相信内存池可以解决我的问题,但我不确定内存池如何知道池中的资源何时被释放以供重用。棘手的部分是,来自池的对象的接收者最终在整个程序中传递该对象,并且很难知道何时可以手动释放该对象。我希望它像一个WeakReference,在那里我可以知道什么时候没有人再使用它。但我的理解是,如果我在内存池中使用WeakReference,那么它最终会从内存池中回收垃圾,我需要这些对象几乎永远保留下来,这样它们就会继续被回收。有时程序可以在不需要对象的情况下运行一段时间,所以我想垃圾回收器会在下一次需要它们之前收集它们,然后在创建数千个这样的对象时触发另一次性能损失。
有没有一种方法可以确保这些对象永远不会被收集,但又知道除了内存池本身之外,什么时候没有对它们的引用?我需要以某种方式实现这些对象的引用计数吗?
我已经用谷歌搜索了几个小时,还没有看到内存池的实现不要求用户在使用完内存池时让内存池知道。我很难相信在C#中没有办法做到这一点。
发布于 2015-10-28 07:39:12
有没有一种方法可以确保这些对象永远不会被收集,但又知道除了内存池本身之外,什么时候没有对它们的引用?
通常,对象池只包含对可用对象的引用(您可以查看ObjectPool implementation in Roslyn)。考虑到这一点,您可以使用终结器来复活对象,并在它无法访问时将其返回到池中。
然而,我不认为它会提高性能。整个池很快就会到达第二代,因此无法到达的对象将需要一个完整的垃圾回收才能返回到池中。根据程序中的内存使用模式,这种情况可能不会经常发生。当然,您可以使用GC.Collect()和GC.WaitForPendingFinalizers(),但这也会影响性能。你可以尝试一下,看看它是否有帮助。
另一个问题是设计-您的对象耦合到池。
我宁愿尝试显式地将对象返回到池中。记住,并不是所有的对象都必须返回。如果没有更多的可用对象,池可以创建新的对象。未返回的将只会被垃圾回收。检查是否存在一些代码路径,其中您确定不再需要这些对象。如果你找不到,试着重构你的代码。
https://stackoverflow.com/questions/33378138
复制相似问题