开心就好问了我一个极有挑战性的问题(压力好大:)):
为什么一个简单的托管程序会使用如此多的内存空间。
对这个问题,我现在并没有一个完整的答案。
不过我想向大家介绍一个内存查看工具: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:暂无标签
留言反馈
非常感谢!
tinbest@linkesen.com
我的mail jessie57@gmail.com
Windows的内存管理机制的作用。最小化后把很多东东都放到虚拟内存里面了。当然物理内存的使用量会变小
一个程序刚运行的时候,没有经过任何的GC操作,因此有很多的内存浪费。这些浪费一部分是由于GC引起的,但是更多的是由其他问题引起的。比如说:一个ArrayList在不足以保存新内容的时候,会将占用空间翻倍。又比如说:某一些非托管的资源还没有被释放,一部分是根本就没有进行释放,另一部分可能需要运行两次的GC才能够释放(Finalize的问题)。
当一个程序最小化之后,会发生什么呢?GC,然后还会释放很多东西,包括非托管资源(比如Pen的Handle等等),此外也许一些类似ArrayList的浪费可能得到了修正,因此你会看到内存哗啦哗啦的狂减。此外,还有一个东西在起作用!那就是虚拟内存:操作系统会把一些可能不常用的东西给放到虚拟内存里面,所以你会看到这时候这个程序所占用的虚拟内存的总量会增加,增加量的大小因程序而异。这个步骤也许CLR有参与(强制Paging),也许没有。但是可以肯定的是,你看到的非托管程序也会有这个现象,估计这一个步骤也会产生影响。
当一个程序从最小化恢复之后,又会发生什么呢?从虚拟内存搬东西出来,然后产生一些非托管资源,比如GDI资源等等(因为你有界面,所以需要画图像啊)。于是你会看到占用的内存变大了,但是比Load的时候要小,因为有些东西释放了之后不会再产生,修正了的浪费现象也不会有逆过程。
其中,我认为非托管资源是造成这个现象的最大问题,因为现阶段版本的GC无法跟踪非托管资源。如果各位不相信,可以创建一个控制台的应用程序看看,也会有这个现象,但是效果就没那么明显了。
个人认为tlist比OS的Task Manager更有用。举个例子,
tlist -m mscorwks.dll 可以用来查找哪些进程装载了CLR。www.sysinternals.com上有一些非常棒的工具。
It's good !
我喜欢tasklist, OS 自己带的,多Cool!
word, ie, msn 似乎都是这样,所以我猜是不是windows的内存管理机制的原因?
这与内存占用过多无关,我的问题是,为什么最小化后再还原就可以占得非常少了?而且任何信息也没有丢失?
既然这样,为什么不在启动的时候就占这么多内存呢?
或者,能不能设计一个方法使其一启动就自动最小化然后再还原呢?
总不能大家都在写说明书的时候,都提醒最终用户先最小化一下吧?:)
是不是最小化的时候,GC会借机工作,回收无用内存?
一个system tray程序占了20+MB内存,.net写的
不知道怎么回事
Windows的Task Manager所显示的内存占用情况有时并不是很准确,还是使用专业的内存检查工具查查看吧。
使用.NET(C#/VB.NET)创建一个空白的Windows Application后,运行此Windows Application:
1. 刚启动的时候,内存占用为28,688K;
2. 最小化后,其内存占用为992K;
3. 还原后,内存占用为8,828K;
即使在该程序的Load事件当中增加显式的GC方法也无法使内存减少。所以我想这与程序启动时将mscorlib.dll加载进内存有关系。但对其中具体的机理并不太清楚,可否在博客堂予以阐述一下?
这是我在一个客户那儿遇到的问题,他们当时在帮助文件中建议用户:启动文件后,请先最小化,然后再还原,会使内存得到显著优化。