Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么每个进程有一个GC和一个托管堆?_.net_Memory Management_Garbage Collection - Fatal编程技术网

.net 为什么每个进程有一个GC和一个托管堆?

.net 为什么每个进程有一个GC和一个托管堆?,.net,memory-management,garbage-collection,.net,Memory Management,Garbage Collection,据我所知,在.NET中,每个进程有一个GC,每个进程有一个托管堆(分为SOH和LOH) 所以我有几个问题: 如果我们在一个进程中有几个应用程序域,那么每个域将在其他域之间共享堆。安全吗?域之间的这种分离是如何实现的 当GC开始工作时,它将挂起工作线程。所以,如果一个应用程序域经常需要启动GC,它将影响到其他根本不需要垃圾收集的域。同样,存储在同一0代区域中的不同域的0代或0代的所有对象之间是否存在0,1,2代的分离 为什么GC和托管堆是按进程实现的,而不是按域实现的 我很困惑。我在许多地方读到,

据我所知,在.NET中,每个进程有一个GC,每个进程有一个托管堆(分为SOH和LOH)

所以我有几个问题:

  • 如果我们在一个进程中有几个应用程序域,那么每个域将在其他域之间共享堆。安全吗?域之间的这种分离是如何实现的

  • 当GC开始工作时,它将挂起工作线程。所以,如果一个应用程序域经常需要启动GC,它将影响到其他根本不需要垃圾收集的域。同样,存储在同一0代区域中的不同域的0代或0代的所有对象之间是否存在0,1,2代的分离

  • 为什么GC和托管堆是按进程实现的,而不是按域实现的


  • 我很困惑。我在许多地方读到,GC堆是每个进程的,因此在AppDomains之间共享。谁能说明这一点?我在哪里可以找到好的解释?不确定这是否应该关闭。GC确实会影响流程中的所有AppDomains,这似乎是naceka所问的问题。看到这里的讨论,我能在评论中回答的最好的问题是,不同的AppDomain都有自己的对象,这是“安全的”,但从GC的角度来看,这些对象在一个堆中,是的,GC会影响过程中的所有AppDomain。如果您不想这样做,最好使用单独的流程。至于为什么会这样,我只能推测,但请记住操作系统处理进程(而AppDomains是CLR构造),因此当操作系统分配内存时,它会将内存分配给整个进程。AppDomains的存在是为了在流程中提供额外的隔离级别。换句话说,不同的隔离级别适用于不同的情况。即使是独立的进程也会争夺系统资源,如处理器时间和内存、数据库连接、网络带宽等。如果它们需要真正、真正地隔离,您可能会在不同地区的不同托管中心的不同服务器上运行。。。但通常单独的进程就足够了,有时不同的应用程序域也足够了。@HansPassant您的假设是错误的:GC发生在进程级别。进程中的所有AppDomain共享相同的GC。触发GC时,GC应影响所有应用程序域。()