zoukankan      html  css  js  c++  java
  • 《Effective C#》读书笔记——了解.NET内存管理机制<.NET资源管理>文章笔记

    话说,本人实在是对纯理论的东西真是不感冒,让我做东西就完全ok,但是要是让我笔试神马的,完全不在行,唉,就因为这个吃了多少亏啊,现在试着补一下理论的吧,刚刚逛园子的时候,瞧见首页有个《Effective C#》读书笔记,觉得这个应该还不错,起码涉及到性能方面,不至于说一些完全不着边际的,理解不了的特殊名称。

    先上LZ的读书笔记:http://www.cnblogs.com/IPrograming/archive/2012/10/22/Effective_CSharp_Unit2.html

    我对这张图中的,B和D被移除完全不了解,谁能给我解释一下呢?

    电脑死机了之后,我突然就想明白为甚么B和D会被移除了,“GC会将那些没有被任何对象之间或间接引用的对象判定为垃圾。”

    托管堆上的内存管理是GC的职责。但是,非托管资源的内存管理则需要由我们开发者自己来负责。.NET为我们提供了两种控制非托管资源生命周期的机制终结器(finalizer)IDisposable接口

    终结器:是一种防御性手段,让对象无论如何都可以被释放掉其中使用的非托管资源。

    内存管理名称 调用时间 缺点 
    终结器  对象成为垃圾之后的某个时间(不知道具体时间,只知道发生在对象不可达之后),迟早都会执行。

     1.仅仅能保证给定类型的大对象所分配的非托管资源最终会被释放,但执行时间不可预料,应避免使用,尽量少让代码逻辑使用。

    2.带来性能上的损失,会给GC带来额外的性能开销。

    IDisposable接口  较终结器来说,对非托管资源的影响更小,避免执行终结器给GC带来性能上的影响。  

     *PS*终结器.缺点.2:当GC发现某个对象属于垃圾,而该对象有需要执行终结器时,就不能将其直接从内存中移除:首先,GC将调用终结器,而终结器并不在执行收集的线程上执行。GC所有需要执行终结器的对象放在专门的队列,然后让另一个线程执行这些对象的终结器。用Finalize方法回收对象使用的内存需要至少两次垃圾回收。因此:使用终结器释放非托管资源,资源对象不但会在内存中停留更长时间,GC也需要额外的线程来运行。

    好伤心,码了好半天的字,保存的时候,园子说session过期了~全没了

    重新写:

    刚刚写到GC中的“代(Generation)”,这次试试全凭个人理解来写,看看能不能写出来。

    GC中的“代(Generation)”:话说,GC中引入代的概念是为了更方便的回收资源,更快速地找到可能是垃圾的对象。

    代的划分:

    上一次垃圾收集之后,新创建的对象被称为第0代,上一次垃圾收集之后仍存在的称为第1代,两次或两次以上垃圾收集仍然存在的,成为第2代。

    第1代要经过10次的垃圾收集才能被消除,第2代要经过100次的垃圾收集才能被消除。

    这样的分代方式是为了能将局部变量和应用程序生命周期中一直使用的对象分开对待。第0代大多数属于局部变量。而成员变量和全局变量则会变成第1代对象,直至变成第2代对象。而GC通过减少检查第1代和第2代的次数来优化执行过程。大概10个周期的GC中,只有一次会同时检查第0代和第1代对象;大概100个周期的GC中,会有一次同时检查所有对象。所以,一个需要终结器的对象可能会比普通的对象多停留9个GC周期。而对于第1代对象,甚至需要100次以上的GC周期才有机会被销毁。

    IDisposable接口:实现IDisposable接口的Dispose方法应该释放它拥有的所有资源。它还应该通过调用其父类型的Dispose方法释放基类拥有的所有资源

  • 相关阅读:
    Emacs 使用YASnippet
    odbc备忘
    Emacs 矩形编辑
    ftp by libcurl
    emacsshell
    Emacs cnblogs 代码着色
    Emacs下的Man
    #include ""还是<>
    三种*
    应对Maze勒索攻击的最佳实践分享
  • 原文地址:https://www.cnblogs.com/Apple010/p/2734131.html
Copyright © 2011-2022 走看看