Cru*_*234 8 .net c# garbage-collection memory-management heap-memory
我在dotmemory中分析了Windows窗体应用程序的内存使用情况,我注意到,对于我的应用程序,有大小不同的0-4堆以及大对象堆.
我只是想知道是否有人对每个堆的用途以及通常存储在每个堆中的内容有一个很好的解释?
Sas*_*ein 13
其他答案似乎忽略了堆积和世代之间存在差异的事实.我不明白为什么商业分析师会混淆这两个概念,所以我强烈怀疑它是堆积而不是几代人.
当CLR GC使用服务器flavor时,它会为进程的affinity mask中的每个逻辑处理器创建一个单独的堆.这种分解的原因主要是为了提高分配的可扩展性,并在GC中并行执行.这些是单独的内存区域,但您当然可以在堆之间具有对象引用,并且可以将它们视为单个逻辑堆.
因此,假设您有四个逻辑处理器(例如,启用了超线程的i5 CPU),您将在服务器GC下有四个堆.
大对象堆有一个令人遗憾,令人困惑的名字.它不是与处理器堆叠相同的意义上的堆.它是包含大对象的多个内存区域之上的逻辑抽象.
由于C#垃圾收集器的工作原理,你有不同的堆.它使用分代GC,根据最近使用的数据分离数据.使用不同的堆允许垃圾收集器更有效地清理内存.
根据MSDN:
堆被组织成几代,因此它可以处理长寿命和短寿命的对象.垃圾收集主要发生在回收通常仅占用堆的一小部分的短期对象时.
- 第0代.这是最年轻的一代,包含短期对象.短期对象的示例是临时变量.垃圾收集在这一代中最常发生.新分配的对象形成新一代对象,并且隐式生成0集合,除非它们是大对象,在这种情况下它们在第2代集合中的大对象堆上.大多数对象在第0代被回收用于垃圾收集,并且不能存活到下一代.
- 第1代.此代包含短期对象,并用作短期对象和长期对象之间的缓冲区.
- 第2代.这一代包含长寿命的对象.长期对象的一个示例是服务器应用程序中的对象,其中包含在进程持续时间内处于活动状态的静态数据.
垃圾收集中未回收的对象称为幸存者,并被提升为下一代.
重要的数据很快被放到垃圾收集器的后端(更高代),并且不经常检查删除.这样可以减少浪费的时间,检查真正需要持久存储的内存,从而可以从高效的垃圾收集器中看到性能提升.
| 归档时间: |
|
| 查看次数: |
2922 次 |
| 最近记录: |