Managed空间

彭刚的blog
随笔 - 26, 评论 - 153, 引用 - 81

导航

标签

每月存档

最新留言

广告

 

开心就好问了我一个极有挑战性的问题(压力好大:)):
为什么一个简单的托管程序会使用如此多的内存空间。
对这个问题,我现在并没有一个完整的答案。

不过我想向大家介绍一个内存查看工具:vadump。
http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/vadump-o.asp

Vadump使用起来非常简单:
vadump -p <process id> -s -o

Vadump会显示各种内存的使用量和各模块的详细信息。以后我会解释各个栏目的意思。
你可以使用tlist来得到一个进程的ID。从我上次post的连接
http://www.microsoft.com/whdc/ddk/debugging/default.mspx
下载调试工具包。 里面就包括Tlist。
我最常用的命令行是: Tlist -t

打印 | 张贴于 2004-03-16 16:09:00 | Tag:暂无标签

留言反馈

#回复: 如何查看内存使用情况---使用Vadump 编辑
aaaaaaaaaaaaaaaaaaaaaaa
2008-02-16 16:39:00 | [匿名用户:f]
#回复: 如何查看内存使用情况---使用Vadump 编辑
看不明白....
2007-04-01 15:23:00 | [匿名用户:故意制造]
#回复: 如何查看内存使用情况---使用Vadump 编辑
也可以发送到我的邮箱522935725@qq.com 
2007-02-13 08:30:00 | [匿名用户: jan]
#回复: 为什么换了一条内存后情况还一样? 编辑
我原来用的是金士顿256MDDR333后来换了个512M的PC3200金士顿内存,用了CPU-Z还是显示256M,请高手帮我解决下,小弟在这里先谢谢了!!!
2007-02-13 08:24:00 | [匿名用户: jan]
#可否使用几块不同的内存条来增加内存? 编辑
发到邮箱:wangfei48480531@126.con
非常感谢!
2006-03-25 23:19:00 | [匿名用户:王先飞]
#re: 如何查看内存使用情况---使用Vadump 编辑
同楼上,也发我一份,谢谢
tinbest@linkesen.com
2005-01-16 14:35:00 | [匿名用户:田蒙]
#re: 如何查看内存使用情况---使用Vadump 编辑
能否介绍一下vadump -p PID 的结果的各个item表示什么?
我的mail jessie57@gmail.com
2004-11-23 17:41:00 | [匿名用户:sichuanyu]
#回复: 如何查看内存使用情况---使用Vadump 编辑
大家把物理内存加上虚拟内存就什么都明白了!
Windows的内存管理机制的作用。最小化后把很多东东都放到虚拟内存里面了。当然物理内存的使用量会变小
2004-04-14 09:37:00 | [匿名用户:吴燕青]
#回复: 如何查看内存使用情况---使用Vadump 编辑
忘了说了,托管内存堆的大小也是翻倍的,也许在最小化的时候还会将大小尽量变成实际占用的大小,我猜测这也是最小化之后再恢复的时候为什么会比原来要小的一部分原因。
2004-04-12 17:53:00 | [匿名用户:sumtec]
#回复: 如何查看内存使用情况---使用Vadump 编辑
据我所知,这个问题好像并不是单纯的GC问题,关于这个问题我是这么理解的:

一个程序刚运行的时候,没有经过任何的GC操作,因此有很多的内存浪费。这些浪费一部分是由于GC引起的,但是更多的是由其他问题引起的。比如说:一个ArrayList在不足以保存新内容的时候,会将占用空间翻倍。又比如说:某一些非托管的资源还没有被释放,一部分是根本就没有进行释放,另一部分可能需要运行两次的GC才能够释放(Finalize的问题)。

当一个程序最小化之后,会发生什么呢?GC,然后还会释放很多东西,包括非托管资源(比如Pen的Handle等等),此外也许一些类似ArrayList的浪费可能得到了修正,因此你会看到内存哗啦哗啦的狂减。此外,还有一个东西在起作用!那就是虚拟内存:操作系统会把一些可能不常用的东西给放到虚拟内存里面,所以你会看到这时候这个程序所占用的虚拟内存的总量会增加,增加量的大小因程序而异。这个步骤也许CLR有参与(强制Paging),也许没有。但是可以肯定的是,你看到的非托管程序也会有这个现象,估计这一个步骤也会产生影响。

当一个程序从最小化恢复之后,又会发生什么呢?从虚拟内存搬东西出来,然后产生一些非托管资源,比如GDI资源等等(因为你有界面,所以需要画图像啊)。于是你会看到占用的内存变大了,但是比Load的时候要小,因为有些东西释放了之后不会再产生,修正了的浪费现象也不会有逆过程。

其中,我认为非托管资源是造成这个现象的最大问题,因为现阶段版本的GC无法跟踪非托管资源。如果各位不相信,可以创建一个控制台的应用程序看看,也会有这个现象,但是效果就没那么明显了。
2004-04-12 17:42:00 | [匿名用户:sumtec]
#回复: 如何查看内存使用情况---使用Vadump 编辑
是啊。CLRProfiler是一个很有用的工具。
个人认为tlist比OS的Task Manager更有用。举个例子,
tlist -m mscorwks.dll 可以用来查找哪些进程装载了CLR。www.sysinternals.com上有一些非常棒的工具。
2004-03-17 10:10:00 | [匿名用户:彭刚]
#回复: 如何查看内存使用情况---使用Vadump 编辑
Why nobody use ClrProfiler ?
It's good !
2004-03-16 23:20:00 | [匿名用户:kaneboy]
#回复: 如何查看内存使用情况---使用Vadump 编辑
vadump -p 或Tlist -t
我喜欢tasklist, OS 自己带的,多Cool!
2004-03-16 21:32:00 | [匿名用户:ccBoy]
#回复: 如何查看内存使用情况---使用Vadump 编辑
加载一堆乱七八糟的东西当然占内存!
2004-03-16 18:48:00 | [匿名用户:rivershan]
#回复: 如何查看内存使用情况---使用Vadump 编辑
我down了,可以装,并且用了也没问题。
2004-03-16 17:36:00 | [匿名用户:sam1111]
#回复: 如何查看内存使用情况---使用Vadump 编辑
偶用的是xp,在下载你新提供的链接
2004-03-16 17:23:00 | [匿名用户:小新]
#回复: 如何查看内存使用情况---使用Vadump 编辑
Have a good dream:)
2004-03-16 17:19:00 | [匿名用户:开心就好]
#回复: 如何查看内存使用情况---使用Vadump 编辑
又试了一下,发现不光是.net程序有这样的问题啊。

word, ie, msn 似乎都是这样,所以我猜是不是windows的内存管理机制的原因?
2004-03-16 17:02:00 | [匿名用户:Justin Shen]
#回复: 如何查看内存使用情况---使用Vadump 编辑
To BZ:
这与内存占用过多无关,我的问题是,为什么最小化后再还原就可以占得非常少了?而且任何信息也没有丢失?
既然这样,为什么不在启动的时候就占这么多内存呢?
或者,能不能设计一个方法使其一启动就自动最小化然后再还原呢?
总不能大家都在写说明书的时候,都提醒最终用户先最小化一下吧?:)
2004-03-16 16:53:00 | [匿名用户:开心就好]
#回复: 如何查看内存使用情况---使用Vadump 编辑
-_- 偶用JB的时候经常N百M内存被JVM占了:)
2004-03-16 16:51:00 | [匿名用户:Bz]
#回复: 如何查看内存使用情况---使用Vadump 编辑
你可以自己写一个程序,然后在Load中用GC显式回收一下,不收任何作用的,应该是在刚Load的时候,都是非托码代码。
2004-03-16 16:51:00 | [匿名用户:开心就好]
#回复: 如何查看内存使用情况---使用Vadump 编辑
呀,果然是这样啊,我刚才顺手把SharpReader最小化了一下,内存使用从一开始的50M降到了1M,然后再打开变为20M.....

是不是最小化的时候,GC会借机工作,回收无用内存?
2004-03-16 16:48:00 | [匿名用户:Justin Shen]
#回复: 如何查看内存使用情况---使用Vadump 编辑
To Sam1111:使用VS.NET自己创建一个空白Windows程序试试:)
2004-03-16 16:37:00 | [匿名用户:开心就好]
#回复: 如何查看内存使用情况---使用Vadump 编辑
我也遇到过

一个system tray程序占了20+MB内存,.net写的

不知道怎么回事
2004-03-16 16:37:00 | [匿名用户:mvm]
#回复: 如何查看内存使用情况---使用Vadump 编辑
程序启动时,我想是有JIT即时编译的内存占用的,但是应该不会差这么多吧。
Windows的Task Manager所显示的内存占用情况有时并不是很准确,还是使用专业的内存检查工具查查看吧。
2004-03-16 16:34:00 | [匿名用户:sam1111]
#回复: 如何查看内存使用情况---使用Vadump 编辑
为了方便大家理解,我把这个问题的原文附下:
使用.NET(C#/VB.NET)创建一个空白的Windows Application后,运行此Windows Application:

1. 刚启动的时候,内存占用为28,688K;

2. 最小化后,其内存占用为992K;

3. 还原后,内存占用为8,828K;

即使在该程序的Load事件当中增加显式的GC方法也无法使内存减少。所以我想这与程序启动时将mscorlib.dll加载进内存有关系。但对其中具体的机理并不太清楚,可否在博客堂予以阐述一下?

这是我在一个客户那儿遇到的问题,他们当时在帮助文件中建议用户:启动文件后,请先最小化,然后再还原,会使内存得到显著优化。
2004-03-16 16:14:00 | [匿名用户:开心就好]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.8