今天写了个很小的程序,程序的功能仅仅是截图,但是如果长时间开启并截图的时候,程序会变的很大,从刚开始的运行在任务管理器中只有十几K大小,运行一段时间后在任务管理器中看到程序可以达到1G或2G甚至更大;最初想到的是所有的截图都保存在内存中,没有释放造成的。去检查代码,发现程序中已经使用GC.Collect();但是为什么程序还是会一直增加呢?由于程序中逻辑判断等比较多,不方便跟踪及查找。所以我自己单独写了个测试程序,去看看调用GC.Collect();释放的问题?

测试环境----

首先准备一个对象(由于程序中使用了一些静态变量),所以准备的对象如下:

public class CountObject
{
public static int Count = ;
public CountObject()
{
Count++;
} ~CountObject()
{
Count--;
}
}

程序很简单,只有一个静态的计数变量。下面在看看主程序:

static void Main(string[] args)
{
CountObject obj;
for (int i = ; i < ; i++)
{
obj = new CountObject();
//obj = null; // 这一步,只是为了更清晰些验证引用的对象是否释放!
GC.Collect(); }
//GC.Collect();
//GC.WaitForPendingFinalizers(); // Count不会是1,因为Finalizer不会马上被触发,要等到有一次回收操作(GC.Collect())后才会被触发。 GC.Collect();GC.WaitForPendingFinalizers();
Console.WriteLine(CountObject.Count);
Console.ReadKey();
}

程序也比较简单,我做了如下测试:

1)使用以上程序运行,发现15行会输出5,说明我们调用了GC.Collect();但程序并没有执行释放,因为查GC的官方解释,是不确定的某个时刻进行回收。

2)把循环每次增大5个。当循环增加到125的时候,多次执行后发现,我本机测试,在第15行的输出是1或125,当增加到10000,每次都输出1,说明符合官方解释;

根据以上代码测试知道,当循环5次的时候,GC并不会立即执行,所以当执行5次循环的时候第8行没起作用。既然不起作用,我们把他注释暂时不用,把11和12行开启。

3)把地8行注释,11,12行开启,执行5次循环,发现15行输出1,多次执行结果相同。

4)再把11行注释,12行开启,执行5次循环,发现15行输出5,多次执行结果相同。

5)再把12行注释,11行开启,执行5次循环,发现15行输出5,多次执行结果相同。

根据4和5的才测试可以看到,当少量的循环时Finalizer不会马上被触发,要等到有一次回收操作(GC.Collect())执行后才会被触发。所以我们可以显式调用 GC.Collect();GC.WaitForPendingFinalizers();这两行代码进行强制回收的执行。

6)验证,把第7行开启,执行测试第15行为0,说明对象如果没有任何的引用则可以强制回收。

以上是本人的一些测试,如果你还有更好的想法,可以提出一起讨论;

转载:https://www.cnblogs.com/mq0036/p/3707257.html

C#内存释放(垃圾回收)的更多相关文章

  1. Java内存与垃圾回收调优

     Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多个独立的部分.广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generat ...

  2. 【转】Java内存与垃圾回收调优

    要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...

  3. 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)

    欢迎一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇 > <实战演练,拒绝996篇 > 欢迎关注我博客 也欢迎关注公 众 号[Ccww笔记],原创技术文章 ...

  4. Java进阶 JVM 内存与垃圾回收篇(一)

    JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...

  5. python内存管理&垃圾回收

    python内存管理&垃圾回收 引用计数器 环装双向列表refchain 在python程序中创建的任何对象都会放在refchain连表中 name = '张三' age = 18 hobby ...

  6. [CLR via C#]21. 自动内存管理(垃圾回收机制)

    目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...

  7. Java编程思想学习笔记_1(Java内存和垃圾回收)

    1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...

  8. Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC

    [转载] :http://my.oschina.net/rouchongzi/blog/171046 Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指 ...

  9. 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点

    小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...

随机推荐

  1. 奇偶数判断1(if,else if语句)

    public class 奇偶数判断 { public static void main(String [] args){ float s = 9f; //取单浮点型变量s,可为任意值 float h ...

  2. [poj1269]Intersecting Lines

    题目大意:求两条直线的交点坐标. 解题关键:叉积的运用. 证明: 直线的一般方程为$F(x) = ax + by + c = 0$.既然我们已经知道直线的两个点,假设为$(x_0,y_0), (x_1 ...

  3. sign和token设计

    签名设计 对于敏感的api接口,需使用https协议 https是在http超文本传输协议加入SSL层,它在网络间通信是加密的,所以需要加密证书. https协议需要ca证书,一般需要交费. 签名的设 ...

  4. 【原创】java删除未匹配的文件夹FileFileFilter,FileUtils,删除目录名字不是某个名字的所有文件夹及其子文件夹

    闲着无聊,写了个小程序. 需求: 举例: 比如我的E盘有一个test的目录,test的结构如下: 要求除了包含hello的目录不删除以外,其他的所有文件夹都要删除. 代码如下: package com ...

  5. js td innerHTML

    用value不好使,用innerHTML可以.JS:document.getElementById("aa").innerHTML="单元格"; body:&l ...

  6. swift - 画图 - 画矩形,虚线,圆和半圆

    import UIKit class JYJYBouncedCouponsViewCellBgView: UIView { //一定要在这里设置 背景色, 不要再draw里面设置, override ...

  7. iframe父窗口和子窗口之间的调用

    1>父窗口获取子窗口 js方法 document.getElementById('if1').contentWindow.document: window.frames["if1&qu ...

  8. Spring框架中的工厂(了解)

    1. ApplicationContext接口 * 使用ApplicationContext工厂的接口,使用该接口可以获取到具体的Bean对象 * 该接口下有两个具体的实现类 * ClassPathX ...

  9. 《计算机网络》谢希仁(第7版) 第四章 c语言http://c.biancheng.net/cpp/html/3137.html

    第四章 网络层 电信网使用面向连接的通信方式,使电信网络能够向用户提供可靠传输的服务. 互联网设计思路:网络层向上只提供简单灵活的.无连接的.尽最大努力交付的数据报(分组)服务. 网络层不提供可靠传输 ...

  10. HDFS高可用性及其分布式系统思想基础

    源自单点失效问题,也就是当NameNode不可用的时候,用什么办法可以平滑过渡? 最直接的办法是再添加一个备用的NN,这就产生了Active NameNode和Standby NameNode的设计思 ...