zoukankan      html  css  js  c++  java
  • 说一说垃圾回收的原理,讲一下过程?

    垃圾回收:只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)

    什么样的对象才会被回收?答:没有变量引用的对象

    什么时间回收?
    系统回收,具体何时回收垃圾由系统自行确定,并不是即时执行回收的
    手动调用垃圾回收器GC.Collect();,不建议使用,垃圾回收时会使程序暂停,影响程序性能

    回收分为两个阶段: 标记 –> 压缩

    基本工作原理就是遍历托管堆中的对象,标记哪些被使用对象(那些没人使用的就是所谓的垃圾),
    然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。

    垃圾回收运行机制:
    垃圾收集器将托管堆中对象分为三代:0、1和2,在CLR初始化时,会选择为三代设置不同的阙值容量,一般为:第0代大约为256KB,第1代2MB,第2代10MB。容量越大效率越低,而GC收集器会自动调节其阙值容量来提升执行效率。在CLR初始化后,首先添加到托管堆中的对象都被定位第0代对象,当有垃圾回收执行时,未被回收的对象代龄将提升一级,变成第1代对象,而后新建对象仍未第0代对象。代龄越小表示对象越新,通常情况下其生命周期也最短,因此GC总是先收集第0代的不可达对象内存。
    随着对象的不断创建,垃圾收集再次启动时则只会检查0代对象并回收0代垃圾对象。而1代对象由于未达到1代容量阙值,则不会进行垃圾回收操作,从而有效地提高了垃圾收集的效率,而这也是代龄机制在垃圾回收中的性能优化作用。当第0代对象释放的内存不足以创建新的对象,同时1代对象的体积也超出了容量阙值是,垃圾收集器将同时对0代和1代对象进行垃圾回收。回收之后,未被回收的1代对象变化2级对象,未被回收的0代对象升级为1代对象,而后新建的对象仍为第0代对象。

    finalize和dispose区别
    • finalize由垃圾回收器调用;dispose由对象调用。
    • finalize无需担心因为没有调用finalize而使非托管资源得不到释放,而dispose必须手动调用。
    • finalize虽然无需担心因为没有调用finalize而使非托管资源得不到释放,但因为由垃圾回收器管理,不能保证立即释放非托管资源;而dispose一调用便释放非托管资源

  • 相关阅读:
    ASP.NET 静态化
    一周死磕fastreport ----ASP.NET (二)
    一周死磕fastreport ----ASP.NET (一)
    前台替换用户名部分转换为*显示
    截取部分字符信息
    win10家庭版设置移动热点出现“我们无法设置移动热点”
    云服务器配置出现的问题 2
    云服务器配置出现的问题 1
    关于使用jquery评论插件...
    $(selector).each() 和$each() 的区别
  • 原文地址:https://www.cnblogs.com/xiaoweigogo/p/7778854.html
Copyright © 2011-2022 走看看