找回密码
 立即注册

QQ登录

只需一步,快速开始

graper

高级会员

45

主题

63

帖子

1348

积分

高级会员

积分
1348

活字格认证

graper
高级会员   /  发表于:2009-12-17 11:55  /   查看:6741  /  回复:0
Post by "KevinShan",  02-29-2008, 17:49
-----------------------------------------------------


提十个有趣的关于.Net CLR,GC的PopQuiz 近日研究CLR和GC,在msdn blog上面看到MS CLR测试小组的一个女技术员提出了十几个问题,感觉问题都挺有趣,也有一定的难度,遂加以修改,删除了几个又添加了几个,广泛征集回答 ^_^

1.
一个托管进程,如果运行在一个双核CPU的机器上,GC是运行于Server GC模式,在假设CPU没有Hyper thread功能的话,这个托管进程会有几个GC Thread?可以用调试工具来证明你的判断吗?
2.
在一个多核的服务器上,如果运行一个winform app程序,这个程序对实时响应的要求比较高,应该使用哪种GC模式?为什么?(可以选择Server GC,Workstation GC,Concurrent-Workstation)
3.
在什么情况或者什么操作下,会进行一次垃圾回收?
4.
什么使一个Object从Generation 0移动到Gen 1,或者是从Gen 1到Gen 2?Pinned Objects呢?
5.
如果一台机器是四核CPU,在运行Server mode的GC和Workstation Mode的GC的时候,分别有多少个GC Heap?
6.
在Dotnet Framework 2.0下,如果发现一个进程里面加载了mscorwks.dll,那么可以因此判定这个线程是运行在Workstation Mode的GC下面?
7.
可以手工的改变一个进程的GC运行模式吗?在什么样的情况下如何修改?
8.
为什么要在打开一个数据库连接时候用完了就关闭这个连接?GC不会给我们处理这些事情么?
9.
Strong References,Weak Reference,Pinned Reference有什么区别?
10.
在Large Object Heap中,所有的大对象是没有经过筛选顺序堆放在一起的吗?


也没有真正的标准答案,回答的有理有据就对。
如果大部分的问题对于你来说都是小case,那么赶紧告诉我你的msn吧,俺这里还有一大票Puzzling Question Queue…..



Reply by "RobynHan",  04-03-2008, 15:25
-----------------------------------------------------

试着回答一下

1,对于一个运行Server GC的多处理器系统,托管被划分成几个区间,每个CPU一个独立的空间,当GC启动时,将在每个CPU上有一个线程。可以通过运行PerfMon.exe工具察看。所以,2个 GC Thread.

2.我觉得应该使用Concurrent-Workstation模式,该模式会在应用程序运行时,开启一个普通优先级的后台进程来构造不可达对象,当构造完成后,可以直接进入GC的压缩阶段。使得用户有更好的交互体验。但会带来性能的一定损失。(后台进程与应用程序竞争CPU)

3.0代对象充满,GC.Collect,Windows内存不足,CLR卸载应用程序域,CLR被关闭。

4。对于从0代到1代。当托管堆要给一个新生对象分配内存,而第0代对象的容量超出了第0戴的阀值,会执行一次GC,这次GC后,留下来的第0代对象就被升级为第1代对象。Pinned Objects是其位置固定的对象,不会被提升代。

5。如第一题的回答,对于多核Server mode的GC,几个CPU就有几个GC Heap。而对于Workstation Mode的GC,永远只有一个GC Heap。

6。2.0的mscorwks.dll包含了workstation和server两种模式GC的实现.所以不一定。可以使用GCSetting.IsServerGC来判断。

7。可以,在配置文件里。<runtime/><gcServer/gcConcurrent enabled = "true">但工作站模式不支持gcServer

8.数据库为本地资源,属于非托管资源,所以CLR不会对其GC.应该对这类资源应用finalize方法或者dispose模式。

9。Strong References:当一个根指向一个对象,就是说存在该对象的一个强引用。

Weak Reference:如果对象存在一个弱引用,当其他对象要引用它时,必须要找到该对象的一个强引用,如果在找的过程中,GC发生,该对象就被GC,如果找到了,且没有GC,则其他对象可以使用该对象。

Pinned Reference:告诉GC,不要GC该对象,即使没有根引用它。

10。大尺寸对象(大于等于85,000B的对象)都被放到一个大对象托管堆上,并被认为是2代对象。其一般不会被搬运,压缩。

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部