据我了解,当为.NET应用程序启用服务器GC模式时,它会为每个处理器分配一个逻辑堆,每个处理器上调度的线程将为其分配内存。
分配给具有多个等待的Task
的内存会发生什么变化?它可能会在ThreadPool的任何Thread上执行,因此可以在逻辑堆之间跳转。
先前逻辑堆上分配的内存是否会复制到当前正在执行的逻辑堆中?在同一逻辑堆/核上不执行Task
个连续是否有任何成本?
答案 0 :(得分:2)
分配给具有多个等待的任务的内存会发生什么变化?它可能会在ThreadPool的任何Thread上执行,因此可以在逻辑堆之间跳转。
无论逻辑分离如何,线程都可以看到整个地址空间。堆对象可以指向另一个没有边界的堆中的不同对象。请记住,仍可以在不同时间片的同一CPU上调度不同的线程。
先前逻辑堆上分配的内存是否会复制到当前正在执行的逻辑堆中?在同一逻辑堆/核上不执行任务延续是否有任何成本?
不,如果运行时被迫在堆之间复制对象,那么会导致巨大的运行时性能损失。同样,线程可能无法在分配它的同一逻辑堆上运行这一事实并不意味着它不能引用该堆。每个核心堆的背后的想法是能够扩展分配并能够改进并行的gc集合。