1)以前一直以为CLR是个运行时环境,所有的。NET程序都是运行在这个运行时环境中的。想想也应该没有问题。后来遇到几篇文章,提到了一个字符串驻留的问题。大意是字符串会一直存在于内存空间中直到CLR终止运行。那么问题来了,这个CLR到底在什么时候终止运行呢?
2)假定我一开始运行了两个.net程序,一个终止了,那么这个时候CLR也终止了么?直觉上应该没有终止,因为还有另外一个。net程序在执行着呢。那么,原先第一个程序中声明的字符串还在内存中驻留着么?不是很清楚,不过直觉上觉得应该没有。
3)既然CLR是个运行时,为所有。net程序提供运行时的支持,那么CLR应该独立于任何单独的。net程序的。这是否意味着CLR应该有一个自己的进程?用Process Explorer看了下,没有CLR自己的进程。那就奇怪了,既然没有独立的进程,CLR是怎么为所有程序提供运行时支持的呢?
4)在网上搜了下,找到两个帖子
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/238c5f43-1d12-4c80-a987-0b8fdfd6d7e4
http://stackoverflow.com/questions/943453/number-of-clr-and-gc-instances-running-on-a-machine
觉得说的还挺清楚的。把CLR简化为几个DLL文件(起始就两个文件Mscoree.dll 和mscorws.dll),既然是DLL,那当然可以被多个不同的。net程序加载了,所以,每个。net程序都运行在一个完全独立的CLR实例上,或者说每个。net程序都有一个自己独立的CLR运行时。当然也有自己独立的GC回收器。当然也可以彼此不受影响的启动,终止。
5)看到这是不是觉得这和原先想象中的“运行时”不太一样?我也觉得怪怪的。
6)不过既然是dll,我相信多个CLR实例间还是可以共享些东西的,至少代码可以共享吧。做了个小实验,结果让人遗憾:打开一个。net程序,发现内存长了8M左右。再开打,还是8M左右,是不是意味着没什么共享?打开了快10个实例,每次都8M左右。我希望是我的实验本身的问题。
7)再换个角度想想,如果真只有一个唯一的CLR实例,那么是不是也意味着只有一个唯一的GC? 如果只有一个唯一的GC,那么我随便写一个。net程序,这个程序不停的调用GC的collect()方法进行垃圾回收,由于垃圾回收时会暂停所有线程的执行,我这样是不是就可以很容易的破坏系统中的其他程序?如果GC不唯一,那么GC堆唯一么? 如果也不唯一,那么分配内存时要先考虑在哪个GC堆上分配的问题。没听过相关的概念呀! 如果GC堆唯一,但是有多个GC线程?也没有听过相关的概念呀!