none
发现了有趣的现象,请问为什么??? RRS feed

  • 问题

  • 在WinCe 环境下用C#开发了一个串口采集程序。

    由原来的多线程串口读写,改为了单个“Timer”计时器控制所有串口的读写,这样节省了不少的内存。

    发现了一个有趣的现象:

    随着程序的运行,系统显示使用的内存会增长。  
    但是,只要人为的点击下程序的主窗体,不需要任何操作,只要点击一下,“系统内存的使用”从内存资源监视器上看,会立刻降下来。   下降到和程序刚开启的时候差不太多。

    这是现象是为什么???        

    问题一:难道是因为点击主窗体一下,程序内存资源就释放了???

    问题二:难道是点击主窗体一下,“内存资源监视器”刷新了。  但是,不点击主窗体的时候,,“内存资源监视器”也会刷新啊,而且还会自动减少。(但是整体还是增长的。)

    问题三:如果开启线程(现在没有使用),线程申请资源的速度  大于 垃圾回收器释放资源的速度,那么就会发生程序开启后内存持续增长。  直到二者速度相等的时候吗???

    Science and technology is my lover.


    2014年8月14日 13:44

答案

  • 1、有可能。单击窗体会导致 Activated 事件,从而执行 UpdateWindow 以及 OnPaint。很多非托管代码会被执行,此时 GC 可能会运行从而降低内存消耗值。

    2、这个结论不成立。

    3、不可能。当 GC 执行垃圾回收时,所涉及到的线程会被 Suspend,从而不可能边回收,边创建资源。当有大量 Object 需要回收时,调用 GC.Collect() 时会有明显的停顿感,所以垃圾回收是很昂贵的操作。这就是为什么 .NET 不建议自己去 Call GC.Collect()。另外,CLR 会在特定的条件下执行 GC.Collect,这些条件包括:内存低、Generation 0 已满、AppDomain 或者 CLR Host 被 Unload、App 被计算机关闭等。


    Mark Zhou

    2014年8月22日 3:26

全部回复

  • WinCe我没有接触过,但是我觉得不排除你点击之后触发系统进行内存回收的可能性。也有可能是像你说的是内存资源监视器没有刷新, 这个我认为可以用一些其他的内存监视软件来监视一下看看结果是否相同就知道了。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年8月15日 6:03
    版主
  • 1、有可能。单击窗体会导致 Activated 事件,从而执行 UpdateWindow 以及 OnPaint。很多非托管代码会被执行,此时 GC 可能会运行从而降低内存消耗值。

    2、这个结论不成立。

    3、不可能。当 GC 执行垃圾回收时,所涉及到的线程会被 Suspend,从而不可能边回收,边创建资源。当有大量 Object 需要回收时,调用 GC.Collect() 时会有明显的停顿感,所以垃圾回收是很昂贵的操作。这就是为什么 .NET 不建议自己去 Call GC.Collect()。另外,CLR 会在特定的条件下执行 GC.Collect,这些条件包括:内存低、Generation 0 已满、AppDomain 或者 CLR Host 被 Unload、App 被计算机关闭等。


    Mark Zhou

    2014年8月22日 3:26