当运行多个.net程序的时候,系统中有多少CLR的实例

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线程?也没有听过相关的概念呀!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值