Dav*_*e S 6 .net cpu caching garbage-collection
我一直在阅读.NET中的垃圾收集和内存管理.我想问以下内容来检查我的理解:
假设我有一个在应用程序开始时创建的单例,它位于GC的第0代.然后想象我有另一个引用这个单例的类,并且在内存中也接近它(因为它也在第0代).推断它们可能位于同一缓存行中是否合理?
当应用程序运行时,GC会将对象提升到第1代,最终生成第2代.创建的任何新对象现在都可以远离内存中的单例.我是否正确地假设新对象之间的访问权限和单例可能会更慢,因为它们不能在同一个缓存行中?
GC是否会尝试将内存中彼此经常访问的对象保持在内存中更近距离?
我不打算尝试优化代码或第二次猜测垃圾收集器,我意识到这是一个人为的例子.我只关心GC如何使用内存以及CPU缓存如何工作的理论.
推断它们可能位于同一缓存行中是否合理?
这是可能的,但可能性很小,除非两个对象碰巧都非常小并且紧接着分配。然而,我不会假设它们会位于同一个缓存行上,因为这不是您在实践中可以控制或强制执行的。
当应用程序运行时,GC 会将对象提升到第 1 代,并最终提升到第 2 代。创建的任何新对象现在都可能距离内存中的单例相当远。我是否正确地假设新对象和单例之间的访问可能会变慢,因为它们不能位于同一缓存行中?
不会有什么区别,除非两个对象一开始恰好位于同一个缓存行上。一旦它们位于不同的缓存行上,它们之间的“距离”就不再重要了。
GC 是否尝试让频繁相互访问的对象在内存中保持更紧密的关系?
不会。对象不会在运行时根据其访问模式进行重新组织和移动。仅当由于先前的收集而有可用空间时才会发生压缩,从而移动对象。
跟踪使用情况和参考模式将非常复杂,并且可能会降低整体性能。
| 归档时间: | 
 | 
| 查看次数: | 64 次 | 
| 最近记录: |