当应用程序运行的时间更长时,.NET单例的性能是否会降低?

Dav*_*e S 6 .net cpu caching garbage-collection

我一直在阅读.NET中的垃圾收集和内存管理.我想问以下内容来检查我的理解:

假设我有一个在应用程序开始时创建的单例,它位于GC的第0代.然后想象我有另一个引用这个单例的类,并且在内存中也接近它(因为它也在第0代).推断它们可能位于同一缓存行中是否合理?

当应用程序运行时,GC会将对象提升到第1代,最终生成第2代.创建的任何新对象现在都可以远离内存中的单例.我是否正确地假设新对象之间的访问权限和单例可能会更慢,因为它们不能在同一个缓存行中?

GC是否会尝试将内存中彼此经常访问的对象保持在内存中更近距离?

我不打算尝试优化代码或第二次猜测垃圾收集器,我意识到这是一个人为的例子.我只关心GC如何使用内存以及CPU缓存如何工作的理论.

Ree*_*sey 3

推断它们可能位于同一缓存行中是否合理?

这是可能的,但可能性很小,除非两个对象碰巧都非常小并且紧接着分配。然而,我不会假设它们会位于同一个缓存行上,因为这不是您在实践中可以控制或强制执行的。

当应用程序运行时,GC 会将对象提升到第 1 代,并最终提升到第 2 代。创建的任何新对象现在都可能距离内存中的单例相当远。我是否正确地假设新对象和单例之间的访问可能会变慢,因为它们不能位于同一缓存行中?

不会有什么区别,除非两个对象一开始恰好位于同一个缓存行上。一旦它们位于不同的缓存行上,它们之间的“距离”就不再重要了。

GC 是否尝试让频繁相互访问的对象在内存中保持更紧密的关系?

不会。对象不会在运行时根据其访问模式进行重新组织和移动。仅当由于先前的收集而有可用空间时才会发生压缩,从而移动对象。

跟踪使用情况和参考模式将非常复杂,并且可能会降低整体性能。