面试题之C# 内存管理与垃圾回收

你说说C# 的内存管理是怎么样的

这句话我记了一个多礼拜了, 自从上次东北师大面试之后, 具体请看<随便扯扯东北师大的面试>. 国庆闲着没事, 就大概了解了一下, 其实大二学习C# 的时候接触过, 只不过那会看的也看的懵懂, 我看的是vir in C#, 顺便查了些资料, 讲真, 看的头痛。现在过了这么久了, 学了这么久了, 再回来看看其实也不难, 当然深入去了解就gg了, 我还记得我的回答是:C# 有个GC可以自己回收, 在加上引用计数。没错, 我回答的就是这么笼统, 现在想想还是紧张了, 自己之前接触过, 其实都有印象, 下次面试不要急, 慢慢回想。

.NET 中的资源分为两类: 托管资源和非托管资源, 既然有两类资源, 那么理所当然就有两种回收方式。托管资源由CLR管理的存在于托管堆上的称为托管资源, 它是由CLR管理, 存在于托管堆上, CLR会在合适的时候调用GC进行回收。非托管资源:
比如数据库连接, 文件句柄, socket等不由CLR管理的资源, GC只回收托管资源, 不回收非托管资源。那么什么时候GC会回收内存?当一个对象的引用计数为0的时候, CLR调用GC回收内存。而相对于非托管资源来讲, 由于不受CLR的管理, 因此我们需要手动回收内存, 调用Dispose方法是个不错的选择, 但是你需要继承自IDisposable接口的类, 看看这个接口的实现:

[ComVisible(true), __DynamicallyInvokable]
public interface IDisposable
{
// Methods
[__DynamicallyInvokable]
void Dispose();
}

还有个Finalize 我没有去了解, 大概看了下, 等会我会给出链接, 你可以自己看看。我们在写数据库连接语句的时候, 经常会使用的一种写法:

using(SqlConnection = new SqlConnection(...))
{
////ADO.NET语句
}

这是比较标准的写法, 大三的时候学ado.net, 记得查资料说, 这可以保证数据库资源的正确释放, 当时没有多想, 今天查资料说, using(){}其实就是调用dispose销毁对象, 而且只有继承了idispose接口的类型才能销毁对象, 而且是try...catch...finally的简化。既然如此, 我们来看看SqlConnection类是不是实现了此接口:

[DefaultEvent("InfoMessage")]
public sealed class SqlConnection : DbConnection, ICloneable
{
// Fields
}

看看DbConnection类:

public abstract class DbConnection : Component, IDbConnection, IDisposable
{
// Fields
}

果然, 还真是如此, 就是说一旦出了using语句的控制范围, 将会自动调用dispose方法销毁对象资源.据说close方法也是调用了dispose(),看看源码:

public void Close()
{
this.Dispose(true);
}

好吧, 还真是, 如果我们手动调用ado.net的close, 那也是可以关闭数据库连接与数据库资源的。

plus:python的内存管理也是通过引用计数来控制的
一点一滴积累, 我还不信我解决不了一个破面试

C#技术漫谈之垃圾回收机制(GC)(转)

面试之C#--垃圾回收器什么时候回收?

浅谈C#垃圾回收

面试题之C# 内存管理与垃圾回收的更多相关文章

  1. C#内存管理与垃圾回收

    垃圾回收还得从根说起,就像生儿育女一样. 根:根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null.根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为 ...

  2. 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)

    使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...

  3. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  4. Java内存管理和垃圾回收

    笔记,深入理解java虚拟机 Java运行时内存区域 程序计数器,线程独占,当前线程所执行的字节码的行号指示器,每个线程需要记录下执行到哪儿了,下次调度的时候可以继续执行,这个区是唯一不会发生oom的 ...

  5. javascript中的内存管理和垃圾回收

    前面的话 不管什么程序语言,内存生命周期基本是一致的:首先,分配需要的内存:然后,使用分配到的内存:最后,释放其内存.而对于第三个步骤,何时释放内存及释放哪些变量的内存,则需要使用垃圾回收机制.本文将 ...

  6. JVM内存管理及垃圾回收【转】

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  7. .NET基础 (05)内存管理和垃圾回收

    内存管理和垃圾回收1 简述.NET中堆栈和堆的特点和差异2 执行string abc="aaa"+"bbb"+"ccc"共分配了多少内存3 ...

  8. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  9. java Vamei快速教程22 内存管理和垃圾回收

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 整个教程中已经不时的出现一些内存管理和垃圾回收的相关知识.这里进行一个小小的总结. ...

随机推荐

  1. spring 的OpenSessionInViewFilter简介

    假设在你的应用中Hibernate是通过spring 来管理它的session.如果在你的应用中没有使用OpenSessionInViewFilter或者OpenSessionInViewInterc ...

  2. Erlang 集群互连测试

    Erlang 集群互连测试Erlang节点相同cookie全互联成为一个集群(cluster).如果2个集群不同cookie, 然后其中有节点连接到对方集群的节点,这2个集群会合并成一个集群吗?连接到 ...

  3. TCP连接建立系列 — 客户端接收SYNACK和发送ACK

    主要内容:客户端接收SYNACK.发送ACK,完成连接的建立. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 接收入口 tcp_v4_rcv |--&g ...

  4. HttpClient4.5.2调用示例(转载+原创)

    操作HttpClient时的一个工具类,使用是HttpClient4.5.2 package com.xxxx.charactercheck.utils; import java.io.File; i ...

  5. 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s

     1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2  spring-mv ...

  6. Hibernate 缓存机制全面讲解

    简介 为了降低应用程序访问我们的数据的时候的频率,提高数据读取的速率.比如计算机中为了缓解CPU和内存之间速度差异而引入的缓存是一样的道理.Hibernate同样对缓存进行了支持,使得程序的运行效率得 ...

  7. Android 5.1 添加硬件抽象层(HAL)和JNI接口总结

    点击打开链接

  8. JqGrid 显示表格

    JqGrid 是前台的表格显示库,使用起来相当方便. 这里分享下本人使用过程中遇到的问题及解决方案 ** 一.rowNum属性 ** 1.如果不设置,默认显示数是20,也就是说超过20以后的数据.不再 ...

  9. UE4使用widget创建UI界面播放视频

    我的目的非常简单,点击按钮,播放或暂停场景中的视频 1.准备了一个mp4视频资源,为视频资源创建了一个Media Texture,在Media Player中选择导入进来的视频资源,再为Media T ...

  10. PA模块报错-实际返回的行数超出请求的行数(分析标准FORM报错解决思路)

    录入预算报错时报错: 分析:这个错误是select into 语句返回多行的结果,但具体在哪? 两种方法查找,trace 或者debug 1.trace 启用调试 获取trace文件 -bash-3. ...