C#垃圾回收GC机制

2023-05-16

https://www.cnblogs.com/yzl050819/p/6245463.html

可以参考这篇文章的内容

程序员不能控制解构器何时将被执行因为这是由垃圾收集器决定的。垃圾收集器检查不在被应用程序使用的对象。它认为这些条件是符合清楚的并且收回它们的内存。解构器也在程序退出时被调用。当解构器执行时其背后所发生的那一幕是解构器隐式调用对象基类的Object.Finalize方法。因此上述解构器代码被隐含转化成:

protected override void Finalize()  
{  
    try  
    {  
       // Cleaning up .  
    }  
    finally  
    {  
       base.Finalize();  
    }
}

其实就是跟java类似。就是记得调试。或者写测试代码的时候如果是通过Console.WriteLine打印记得,立刻调用Flush刷新Console。避免出现理解上的错误,就是到底这个打印是什么时候输出的。

以下是我的测试代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ceshidemo
{
    class Tid
    {
        public static void printid()
        {
            Console.WriteLine("当前线程id是:"+tid().ToString());
            Console.OpenStandardOutput().Flush();
        }
        public static int tid()
        {
            return Thread.CurrentThread.ManagedThreadId;
        }
    }
    class A
    {
        public A()
        {
            Console.WriteLine("Creating A");
        }
        ~A()
        {
            Console.WriteLine("Destroying A");
        }
    }

    class B : A
    {
        public B()
        {
            Console.WriteLine("Creating B");
        }
        ~B()
        {
            Console.WriteLine("Destroying B");
        }

    }
    class C : B
    {
        public C()
        {
            Console.WriteLine("Creating C");
        }

        ~C()
        {
            Console.WriteLine("Destroying C");
        }
    }

    class classA
    {
        public classA()
        {
            Console.WriteLine("ClassA Init");
        }
        
        ~classA()
        {
            Console.WriteLine("ClassA UnInit");
            Tid.printid();
        }
    }


    class Program
    {
        public static string g_static_string = static_return_string();
        public static string static_return_string()
        {
            Console.WriteLine("这里可以执行 初始化哦 这是program的初始化");
            Tid.printid();
            return "str";
        }

        static void demo002()
        {
            Console.WriteLine("进入 demo002");
            demo001();
            GC.Collect();
            Thread.Sleep(3000);
            Console.OpenStandardOutput().Flush();  
            Console.WriteLine("离开 demo002");
            Console.OpenStandardOutput().Flush();
        }
        static void demo001()
        {
            Console.WriteLine("进入 demo001 进入作用域");
            classA _a;
            _a= new classA();
            Console.WriteLine("离开 demo001 离开作用域");
        }

        static void Main(string[] args)
        {

            Console.WriteLine("Main函数线程  "+Tid.tid());
            Console.ReadLine();
            C c = new C();

            Console.WriteLine("开始调用 调用 demo001 的外面 111 ");
            demo002();
            Console.WriteLine("demo002外面调用已经结束了 ");
            Console.OpenStandardOutput().Flush();
            Console.WriteLine("Press enter to Destroy it");
            Console.ReadLine();
            c = null;
            //防止是io没有刷新遇到的问题。
            Console.WriteLine("at the end of the line ");
            Console.OpenStandardOutput().Flush();
            Console.ReadKey();
        }
    }
}

 

离开作用域后 new对象就被认定是可以可以删除的了。只是GC机制不会立马删除,除非强制调用GC.collect

调用GC.collect也可以发现析构的线程不一样了,真正的析构classA的线程变成了2。就是说GC.collect是促使进行资源回收。真正的回收是在另一个线程完成的。所以有时候调用GC.collect发现有些对象的析构函数执行不是和调用GC.collect执行部分的代码流程是顺序的也是这个原因,通常会认为collect调用完毕,那些析构函数就完成了,这是错的,但是你在collect后面sleep几秒就看得出顺序,这是因为真正执行析构函数的线程已经得到机会在执行了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#垃圾回收GC机制 的相关文章

  • STM32使用内核System Tick定时器实现微秒延时

    同名微信公众号 固件工人 同步发布的文章 xff0c 欢迎同时关注 xff0c 及时获取最新文章 在单片机的程序开发中 xff0c 延时一般都会用到 xff0c 在对延时精度要求不高的场合 xff0c 一般使用软件延时实现 xff0c 就是
  • STM32软件模拟I2C从机的实现方法

    1 1 前言 在使用I2C通信时 xff0c 一般会用到软件模拟I2C 目前网络上能搜索到的软件模拟I2C一般都是模拟I2C主机 xff0c 很少有模拟I2C从机的例程 由于I2C主机在进行数据收发时 xff0c 有明确的可预见性 xff0
  • Ubuntu下QT创建带菜单和工具栏的窗口

    同名微信公众号 固件工人 同步发布的文章 xff0c 欢迎同时关注 xff0c 及时获取最新文章 1 1 测试平台 这里使用的开发环境如下 操作系统 xff1a Ubuntu 20 04 2 LTS x86 64 xff08 使用uname
  • wxWidgets学习:Ubuntu下cmake编译链接wxWidgets源码报错[Could NOT find GSTREAMER]

    同名微信公众号 固件工人 同步发布的文章 xff0c 欢迎同时关注 xff0c 及时获取最新文章 1 测试平台 这里使用的开发环境如下 操作系统 xff1a Ubuntu 20 04 2 LTS x86 64 xff08 使用uname a
  • VS2012 C++/CLR 无法创建Windows窗体应用程序的解决方法

    参考资料链接 xff1a 1 https zhidao baidu com question 493819968 html 2 http blog csdn net dreamrabbit article details 9044999 在
  • VC中自定义打印调试信息函数,打印调试信息到DebugView上

    该文档参考了以下网友的文章 xff0c 在此表示感谢 1 xff08 更新 xff09 OutputDebugString函数简单封装 xff0c 实现格式化打印输出 xff08 VC 43 43 xff09 链接 xff1a http b
  • C语言编译器之三,VC++

    三 Visual C编译器 Microsoft Visual C 43 43 xff08 简称Visual C 43 43 MSVC VS或VC xff09 是微软公司的免费C 43 43 编译器与开发工具 xff0c 具有集成开发环境 x
  • 彻底弄懂计算机中的大端小端

    大端与小端这个问题在做和其他设备交换原始字节数据的时候是非常重要的概念 xff0c 也是必须要掌握的内容 xff0c 但是很多人就是仅仅是稍微有些了解 xff0c 但每次真正去做东西的时候 xff0c 还是要花半天去想 xff0c 博主就是
  • QGC 报错 Fail: No CPU load information

    据说是因为bootloader与px4固件版本不匹配 xff0c 需要修改qgc中的参数 xff1a 使其能够在安装固件的时候更新到匹配版本的bootloader 步骤一 xff1a 修改 SDLOG PROFILE 参数从 default
  • Redis复习+面试题

    目录 1 Redis五大数据类型及使用场景 xff1a 1 Redis五大数据类型及使用场景 xff1a String xff1a Redis的字符串是动态字符串 xff0c 内部表示是一个字符数组 xff0c 这里提Python的字符串是
  • 详解大端模式和小端模式

    一 大端模式和小端模式的起源 关于大端小端名词的由来 xff0c 有一个有趣的故事 xff0c 来自于Jonathan Swift的 格利佛游记 xff1a Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战 战争的原
  • 【c语言数据结构】单链表的基本操作

    一 目的与要求 1 复习C程序调试 运行的基本操作方法 2 熟练掌握编辑 编译 连接和运行C 程序的方法 3 掌握单链表的定义 创建 插入和删除操作程序实现 二 实验内容 1 定义单链表结构体 xff0c 获取数据元素 2 创建链表以输入
  • 【数学建模笔记】【第七讲】多元线性回归分析(二):虚拟变量的设置以及交互项的解释,以及基于Stata的普通回归与标准化回归分析实例

    温馨提示 xff1a 本文共有9683字 xff0c 阅读并理解全文需要半小时左右 一 回归系数的解释 书接上文 xff0c 上文谈到内生性的解决之后 xff0c 我们对回归问题的探究还没有完 比如下面这个问题 xff1a 我们说线性回归他
  • 【番外】Stata软件安装教程

    将下载后的资源解压缩之后双击安装软件 xff1a 点击 下一步 点击 下一步 这里选择第二个 SE 这个选项 xff0c 然后点击 下一步 此处尽量不要修改安装路径 xff0c 尽量使用默认安装路径 然后一直点 下一步 即可 安装完成之后点
  • 【蓝桥杯】【嵌入式组别】第十二节:USART串口通讯

    USART串口通讯 USART xff1a 通用同步异步收发器串口发送程序设计 xff1a 如何连续打印helloworld能不能发送中文 xff1f 串口发送printf重定向 串口接收程序设计 xff1a 串口接收固定长度数据 xff1
  • 【蓝桥杯】【嵌入式组别】第十四节:PWM输出编程

    PWM输出编程 PWM输出原理单路PWM信号输出双路PWM信号输出 目的 xff1a 在特定管脚上产生频率和占空比可调的方波信号 比赛我们主要掌握PA6和PA7就可以了 PWM输出原理 CNT 定时器中的计数器 xff0c 配置成1us增加
  • 【蓝桥杯】【省赛真题】

    关于第十一届第一场蓝桥杯中如何判断串口数据的问题的代码如下 xff1a span class token comment USART span u8 rx buf span class token punctuation span span
  • 【2023年第十三届MathorCup高校数学建模挑战赛】思路总结分析

    写在前面的话 我们选择A题 xff0c 分析A题题目可以得知属于一种组合优化模型 xff0c 类似于旅行商问题 xff0c 0 1背包问题等等 该类问题通常采用遗传算法 xff0c 粒子群算法 xff0c 模拟退火算法等算法进行求解 由于本
  • 【博弈论】【第一章】博弈论导论

    博弈论导论 例题 选择数字 例题 巴什博弈 例题 射手博弈博弈论的基本概念 xff1a 参与人战略行动信息支付函数 例题 分100元 课程概述 xff1a 例题 选择数字 两个参与人A和B xff0c 轮流选择 3 4 5 6 7 8 9
  • C++中的const_interator

    当我们做出如下定义时 vector lt ID gt ids vector lt ID gt const iterator iter 并进行了下面的操作 xff0c 则是正确的 for iter 61 ids begin iter 61 i

随机推荐

  • JAVA基本数据类型的字节与位数以及String类型的最大长度

    目录 基本数据类型的字节与位数如下 xff1a String类型的最大长度 基本数据类型的字节与位数如下 xff1a 变量名称 字节 位数byte 1 8short 2 16int 4 32long 8 64float 4 32double
  • arduino、Ms5611与1602实现气压温度高度显示

    项目场景 xff1a arduino Ms5611与1602实现气压温度高度显示 因为项目需求 xff0c 需要测试Ms5611的精度 xff0c 于是利用arduino和LED1602 xff0c 将Ms5611采集的数据采集并实时显示出
  • UART协议详解

    UART简介 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART UART通信在工作中相当常见 xff0c 项目中需要生成uart信号 xff
  • vector的capacity新增长方式(dev c++实测)

    vector的capacity 调用返回vector中最大能够存储的元素个数 xff0c 也即在下一次需要扩充容量之前能容纳的元素个数 reserve会使容器在必要的时候增长 xff0c 以便容纳制指定数目的元素 include lt io
  • Android DNS Resolver

    DNS 解析器 xff08 DNS Resolver xff09 DNS 解析器模块可保护用户免受 DNS 拦截和配置更新攻击 xff0c 并改进了 DNS 解析的网络性能 此模块包含用于实现 DNS 桩解析器的代码 xff0c 该解析器可
  • Python量化相关

    量化实例 xff1a 可转债轮动策略 LOF 封基 ETF动量策略 小市值策略 Python xff1a Python 基础教程 菜鸟教程Python 3 教程 菜鸟教程Windows搭建python开发环境 xff0c python入门到
  • Visual Basic相关

    vb教程
  • 三极管和运放构成的几种恒流源电路分析

    如何利用三极管和运放设计一个150mA的恒流源 xff0c 求电路图 xff0c 验证过的 xff01 xff01 xff01 三极管和运放构成的几种恒流源电路分析 还不是太理解 这几种电路都可以在负载电阻RL上获得恒流输出 第一种由于RL
  • AI相关资料整理

    scikit learn中文社区
  • Android开发知识备忘

    Android Studio 上jar包 xff0c aar包 xff0c aidl xff0c aidl打成aar包的正确使用Android AIDL bindService后不能调用onServiceConnected方法 xff08
  • 【C++】struct和class的区别

    在C 43 43 中我们可以看到struct和class的区别并不是很大 xff0c 两者之间有很大的相似性 那么为什么还要保留struct 这是因为C 43 43 是向下兼容的 xff0c 因此C 43 43 中保留了很多C的东西 一 首
  • MPLAB程序中如何设置配置字

    基于MPLAB X IDE配置位设置讲解 在不同的芯片中其配置字不尽相同 xff0c 但是管家最常用到的有如下几部分 xff1a 1 芯片的振荡模式 xff0c 有内外之分 xff0c 还有三个速度的选择 2 xff0c 片内看门狗的启用
  • 直流电机驱动电路设计

    http bbs ednchina com BLOG ARTICLE 177889 HTM 一 直流电机驱动电路的设计目标 在直流电机驱动电路的设计中 xff0c 主要考虑一下几点 xff1a 功能 xff1a 电机是单向还是双向转动 xf
  • 奇偶校验码

    http blog 163 com ma youzhong blog static 42459154200821785759423 老顽童 xff08 原创 xff09 二进制数据经过传送 存取等环节 xff0c 会发生误码 xff08 1
  • 串口半双工与全双工

    怎么这么多人认为 xff14 xff18 xff15 是半双工 xff1f 大家能不能看一下具体的定义啊 xff1f xff01 不要认为我们经常使用 xff14 xff18 xff15 的半双工方式就认为 xff14 xff18 xff1
  • NPN传感器PNP传感器原理和分类

    PNP与NPN型传感器其实就是利用三极管的饱和和截止 xff0c 输出两种状态 xff0c 属于开关型传感器 但输出信号是截然相反的 xff0c 即高电平和低电平 PNP输出是高电平1 xff0c NPN输出的是低电平0 PNP与NPN型传
  • Windows系统上在vscode连接服务器http-server

    1 打开vscode xff0c 创建一个HTML文件 2 查看 gt 终端 3 Windows10的终端是powershell xff0c 点击 xff0c 在下拉栏找到默认 xff0c 更改成cmd终端 4 输入 npm install
  • 精密单点定位技术(PPP)和RTK技术有什么区别

    首先用通俗的话来说 xff0c RTK是先架设一个基站 xff0c 基站把自己的误差是多少告诉我 xff0c 我再用这个误差项去消除自己移动站的误差 而PPP不用我们自己架设基站 xff0c 已经有一些基础的基站 xff0c 通过卫星发送的
  • ubuntu network manager 网络需要手工重启解决

    乌班图的无线和网络需要手工 sudo service network manager restart才可以搜索到 其实主要是我手工编辑了 etc network interface 修改的方法就是在 etc NetworkManager N
  • C#垃圾回收GC机制

    https www cnblogs com yzl050819 p 6245463 html 可以参考这篇文章的内容 程序员不能控制解构器何时将被执行因为这是由垃圾收集器决定的 垃圾收集器检查不在被应用程序使用的对象 它认为这些条件是符合清