none
内存的监控与优化 RRS feed

  • 问题

  •    看到了本论坛的一个帖子:http://social.microsoft.com/Forums/zh-CN/2212/thread/0b3512cd-38ec-4fc6-9930-b6534d7f7def
       结合自己最近的一些工作,有以下几个疑问:
       1:GC机制是不是真的只在内存不足(或者非常必要)的时候才会释放不需要的内存?假设一个很极端的例子,我64G内存的服务器上跑一个初始100M内存的程序,是不是这个程序内存占用到好几个G都不会释放内存呢?
       2:如果一个类中有一些较长的string变量(或属性),存放大量信息(几十K甚至上M),我在主程序里又声明了这个类的实例.这个时候内存是怎么分配的呢?
       3:我声明这个实例的时候,是不是就会调用内存存放string变量里的信息?
       4:然后我用实例引用这个string变量的时候,又会把原先的内存复制一份?还是共享内存?
       5:如果我想在每次调用完这个类之后就把内存释放掉,是在主程序里直接调用这个类的 .dispose方法吗?
    2009年11月9日 4:14

答案

  • 你好!
         1,.NET的垃圾收集器是基于代龄来实现,当第0代对象达到一个阀值时(初始化CLR是,大概是256KB,随着程序的运行,这个值会根据程序的行为自动调节)就会执行垃圾收集了!
         2,引用类型的实例初始化的时候,其中的引用类型的字段保存的只是一个引用(也就是地址),这个地址指向这个字段实际的一些数据。string就是引用类型。而值类型的字段则直接保存这个字段的数据!引用类型的对象是保存在托管堆中的
         3,声明的时候不做什么,初始化的时候才真正构建这个对象
         4,通过地址访问的,不会复制的
         5,一般情况下,如果你的类型不包含非托管资源,没有必要显式调用Dispose方法!可以把这个工作交给垃圾收集器自动处理!
         你可能有一些误解,认为GC过程相当的不智能,当时实际上.NET的垃圾收集器相当的优秀和智能,当你深入了解了他的机理之后我相信你也会这样认为的。
        
    周雪峰
    • 已标记为答案 picat 2009年11月11日 9:37
    2009年11月9日 5:59
    版主