gpt4 book ai didi

.net - 每个 CLR 或每个进程是否有一个托管堆?

转载 作者:行者123 更新时间:2023-12-04 12:48:04 25 4
gpt4 key购买 nike

据我所知,之前 .NET 4.0 事情很简单:一个流程只能托管一个 CLR .

但是从 4.​​0 版开始,一个进程可以承载多个 CLR。

在这种情况下,我猜有 每个 CLR 一个堆 ,因为每个 CLR 都有自己的状态和自己的 GC,有自己的内存管理方式和自己的收集周期,所以共享内存似乎是不可能的。

1)您能否确认这是确凿的情况还是更微妙?

2) 托管在同一进程中的两个 CLR 是严格隔离的还是可以共享任何内容?
(特别是如果他们有相同的版本,他们是否可以相互了解)

我想答案是肯定的和肯定的(孤立的),但我想确定一下。

感谢您的任何见解。

最佳答案

我们需要的第一件事是整理或绘制一般情况下发生的事情:

您执行您的 exe 文件 -> 该文件要求 .NET CLR -> CLR 进程 - 托管您的执行。

简而言之,我会把它画得更短:

这是 4.0 之前发生的事情:
执行 File1.exe -> CLR Process -> hosts (.net File1.exe) => 这里我假设 file1.exe 是 .net1
执行 File2.exe -> CLR Process2 -> hosts (.net File2.exe) => 这里我假设 file2.exe 是 .net2
执行 File3.exe -> CLR Process3 -> hosts (.net File3.exe) => 这里我假设 file3.exe 是 .net3

在上面的例子中,我假设 .net 3 安装在机器上,这就是为什么 .net3 CLR 是进程 - 确实 - 它被加载了 3 次!但是,由于 DLL 是相同的 DLL,因此 windows 可能会共享它,使其就像只加载一次一样。但是在内存中 - 使用了 3 个不同的指令指针,并且每个进程都有自己独立的堆。

这就是 4.0 和 4.5 发生的情况:
执行 File4.exe -> CLR Process45 -> hosts (.net File4.exe) => 这里我假设 file4.exe 是 .net4
执行 File45.exe -> CLR Process45 -> 还托管 (.net File45) =>这里我假设 file45.exe 是 .net4.5

在上面的例子中,我假设 .net 45 安装在机器上,所以 .net CLR4 是只加载一次(而不是两次!正如前面的示例逻辑所预期的那样)的进程

您可以在我在答案末尾提供的链接中阅读更多内容,以了解哪些版本可以“并排”在一起 - 并非所有版本都可以与所有版本并排放置。

我的答案的第二部分与您确切提出的问题更相关:
任何进程都有一个单一的堆——它不能改变,因为它是硬件的工作方式。 (不管 CLR 在这个意义上只是另一个进程可以做什么)
但是为了能够为每个被托管的 exe 提供一个堆,他们发明了一个名为“blob-heap”的概念,它被放置在 CLR 进程的堆中。可以一次管理如此多的 blob 堆。
CLR 中的每个托管应用程序都有自己的 GC,它们是隔离的,彼此不知道。
据我了解,.NET4 中只使用了一个 CLR,它能够管理许多主机项目或应用程序。这意味着许多应用程序可能会相互减慢速度,但即使使用“多 CLR”方法也是如此。更严重的问题是,如果 CLR 本身停止运行......所有托管应用程序都将停止运行它。我不知道如何或是否在架构中解决了这种潜在问题。

我从所有这些来源阅读以收集这个答案:
Common Language Runtime (CLR)
ECMA C# and Common Language Infrastructure Standards
Common Language Infrastructure (CLI) Partitions I to VI (6th edition)
In-Process Side-by-Side
Loading multiple CLR Runtimes (InProc SxS) – Sample Code

关于.net - 每个 CLR 或每个进程是否有一个托管堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19368780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com