您的位置:首页 > 其它

判断GC运行模式的几种方法

2008-03-09 14:39 411 查看
上次提出了一个问题:

一个托管进程,如果运行在一个双核CPU的机器上,GC是运行于Server GC模式,在假设CPU没有Hyper thread功能的话,这个托管进程会有几个GC Thread?可以用调试工具来证明你的判断吗?



这个问题的答案,想必很多人也知道,几个cpu就几个GC Thread。不过接下来的内容,主要侧重于,变换几种不同的方式来解决这个问题:

方法一:

在WinDBG中,加载SOS模块:

0:003> !eeversion

2.0.50727.832 retail

Workstation mode

SOS Version: 2.0.50727.832 retail build

这里的Workstation mode表示的就是本机运行的是Workstation模式的垃圾回收方式。

方法二:

首先列出某个托管线程当前加载的modules:

0:003> lm

start end module name

00400000 00408000 TestConcoleApp (deferred)

00ec0000 00f06000 mscorlib_resources (deferred)

…………………..

79000000 79045000 mscoree (deferred)

79060000 790b3000 mscorjit (deferred)

790c0000 79b90000 mscorlib_ni (deferred)

79e70000 7a3d6000 mscorwks (export symbols)

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

7c800000 7c91d000 KERNEL32 (export symbols)

C:\WINDOWS\system32\KERNEL32.dll

7c920000 7c9b4000 ntdll (export symbols)

C:\WINDOWS\system32\ntdll.dll

7d590000 7dd83000 shell32 (deferred)

Unloaded modules:

60340000 60348000 culture.dll

接着列出mscorwks模块的详情:

0:003> lm v m mscorwks

start end module name

79e70000 7a3d6000 mscorwks (export symbols)

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

Loaded symbol image

file: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

Image path: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

Image name: mscorwks.dll

Timestamp: Fri Apr 13 15:15:54 2007 (461F2E2A)

CheckSum: 00565A86

ImageSize: 00566000

File version: 2.0.50727.832

Product version: 2.0.50727.832

File flags: 0 (Mask 3F)

File OS: 4 Unknown Win32

File type: 2.0 Dll

File date: 00000000.00000000

Translations: 0409.04b0

CompanyName: Microsoft Corporation

ProductName: Microsoft® .NET Framework

InternalName: mscorwks.dll

OriginalFilename: mscorwks.dll

ProductVersion: 2.0.50727.832

FileVersion: 2.0.50727.832 (QFE.050727-8300)

FileDescription: Microsoft .NET Runtime Common Language Runtime - WorkStation

LegalCopyright: © Microsoft Corporation. All rights reserved.

Comments: Flavor=Retail

Lm这个命令列出该线程加载的modules。用v参数来现实详情,m参数指定特定的modules。同样可以得到GC是运行在WorkStation模式下。

方法三:

打开DotNet Framework配置工具,在“My Computer”上面点击右键,同样可以得到显示的是WorkStation模式。



方法四:

可以在调试一个托管,或者是native线程,使用~k命令显示堆栈的调用情况。如果看到类似mscorwks!SVR::gc_heap::这样的方法,SVR就表示的是使用的Server模式。如果是看到类似mscorwks!WKS这样的字样,就表示的是使用的WorkStation模式。这也说明了在Framework2.0里面,这两种模式的实现,是在一个modules里面实现的。不过我翻遍了一个叫做IpSwiter的东西,也没用看到这样的字样…sad..

well,that's all i know,and you can share your ways with me ^_^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: