1、“.....,最能直接从内存上删除这个对象。首先,它要调用析构函数,但析构函数调用不是在垃圾回收器同个线程上运行。取而代之是,不得不把对象放置到析构队列中,让另个线程让执行所有析构函数。继续它自己工作,从内存上移除其它垃圾。在下个回收时,那些被析构了对象才会再从内存上移除。图展示了三个内存使用不同情况。注意,那些须要析构对象会待在内存里,直到下次回收。图这个顺序展示了析构函数在垃圾回收器上起作用。对象会在内存里存在时间更长,须要启动另个线程来运行垃圾回收器。这用使你相信那些须要析构对象在内存至少多生存个回收循环。但,我是简化了这些事。实际上,因为另个介入译注其实只有个,作者是想引用回收代问题。,使得情况比这复杂得多。回收器采用代来优化这个问题。代可以帮助来很快标识那些看上去看是垃圾对象。所以从上次回后开始创建对象称为第代对象,所有那些经过次回收后还存在对象称为第代对象......”。
2、“.....分代目就是用来区分临时变量以及些应用程序全局变量。第代对象很可能是临时变量。成员变量,以及些全局变量很快会成为第代对象,最终成为第代对象。通过限制检测第以及第代对象来优化它工作。每个循环都检测第代对象。粗略假设个会超过次检测来检测第代对象,而要超过次来检测所有对象。再次考虑析构函数开销个须要析构函数对象可能要比个不用析构函数对象在内存里多待上个回收循环。如果它还没有被析构,它将会移到第代对象。在第代对象中,个可以生存上个循环直到下个第代集合。结束时,记得个垃圾回收器负责内存管理托管环境最大好处内存泄漏,其它指针服务问题不在是你问题。非内存资源迫使你要使用析构函数来确保清理非内存资源。析构函数会对你应用程序性能产生些影响,但你必须使用它们来防止资源泄漏译注请注意理解非内存资源是什么,般是指文件句柄,网络资源,或者其它不能在内存中存放资源......”。
3、“.....接下来具体原则将会帮助你更有效使用环境来开发程序。原则选择变量初始化而不是赋值语句些类经常不只个构造函数。时间长,就难得让它成员变量以及构造函数进行同步了。最好确保这样事不会发生方法就是在声明就是时间就直接初始化,而不是在每个构造函数内进行赋值。而且你应该使用初始化器语法同时为静态和实例变量进行初始化。在里,当你声明个变量时就自然构造了这个成员变量。直接赋值,忽略你最终会给添加多少个构造函数,会正确初始化。编译器会产生些代码,使得在你任何个构造函数调用前,都会初始化你声明实例变量。当你添加个新构造函数时,就给你初始化了。当你添加了个新变量,你不用在所有构造函数里添加初始化代码直接在声明地方对它进行初始化就行了。同样重要是如果你没有明确声明任何个构造函数,编译会默认给你添加个,并且把所有变量初始化过程都添加到这个构造函数里......”。
4、“.....初始化生成代码会放置在类型构造函数之前。初始化会在执行类型基类构造函数之前被执行,并且它们是按你声明先后关系顺序执行。使用初始化器是个最简单方法,在你类型里来避免使用些没有赋值变量,但这并不是很好。下面三种情况下,你不应该使用初始化器语法。首先就是,如果你是初始化个对象为,或者为。系统默认会在你任何代码执行前,为所有内容都初始化为。系统置初始化是基于底层指令,对整个内存块设置。你任何其它置初始化语句是多余。编译器忠实添加额外指令把内存设置为。这并没有错,只是效率不高。事实上,如果是处理值类型数据,这是很不值两条语句都是把变量置为。第个是通过设置包含内存来置而第二个是通过指令,这对变量会产生装箱与拆箱操作。这很要花点额外时间参见原则。第二个低效率是在你为个对象添加两个构造函数时会产生。你使用初始化器初始化变量......”。
5、“.....这个版本两个不同对象在它构造函数内,当你创建个新对象时,特别指定集合大小,你创建了两个数组列表。其中个很快成为垃圾对象。初始化器在所有构造函数之前会执行,构造函数会创建第个数组列表。编译器产生了这个个版本,当然这是你决不会手动写出来。,最,,,,,,,,,,能直接从内存上删除这个对象。首先,它要调用析构函数,但析构函数调用不是在垃圾回收器同个线程上运行。取而代之是,不得不把对象放置到析构队列中,让另个线程让执行所有析构函数。继续它自己工作,从内存上移除其它垃圾。在下个回收时,那些被析构了对象才会再从内存上移除。图展示了三个内存使用不同情况。注意,那些须要析构对象会待在内存里,直到下次回收。图这个顺序展示了析构函数在垃圾回收器上起作用。对象会在内存里存在时间更长,须要启动另个线程来运行垃圾回收器。这用使你相信那些须要析构对象在内存至少多生存个回收循环。但......”。
6、“.....实际上,因为另个介入译注其实只有个,作者是想引用回收代问题。,使得情况比这复杂得多。回收器采用代来优化这个问题。代可以帮助来很快标识那些看上去看是垃圾对象。所以从上次回后开始创建对象称为第代对象,所资源管理比尔瓦格拉中文版改善程序种方法,第二章,资源管理,比尔瓦格拉个简单事实应用程序是在个托管环境里运行,这个环境和不同设计器有很大冲突,这就才有了。极大限度上讨论这个环境好处,须要把你对本地化环境想法改变为。也就意味着要明白垃圾回收器。在你明白这章里所推荐内容时,有必要对内存管理环境有个大概了解。那我们就开始大概了解下吧。垃圾回收器为你控制托管内存。不像本地运行环境,你不用负责对内存泄漏,不定指针,未初始化指针,或者个其它内存管理服务问题。但垃圾回收器前不是个神话你样要自己清理。你要对非托管资源负责,例如文件句柄,数据链接,对象,对象,以及其它些系统对象......”。
7、“.....明确设计风格可以更容易实现。循环引用,不管是简单关系还是复杂网页对象,都非常容易。标记以及严谨高效算法可以检测到这些关系,并且完全删除不可达网页对象。是通过对从应用程序根对象开始,通过树形结构漫游来断定个对象是否可达,而不是强迫每个对象都保持些引用跟踪,就是这样。就是个很好例子,展示了这样算法是如何简化并决定对象所属关系。是个集合,而每个又是集合,每个又是集合,定义了这些类型关系。这里就有些从到它列引用。而同时,也同样有个引用到它容器上,也就是。包含引用到,最后每个对象都包含个引用到。如果这还不够复杂,那可以创建个,它提供对经过过滤后数据表顺序访问。这些都是由管理。所有这些贯穿网页引用构成了。释放内存是责任。因为框架设计者让你不必释放这些对象,这些复杂网页对象引用不会造成问题。没有必须关心这些网页对象合适释放顺序,这是工作。设计结构可以简化这些问题......”。
8、“.....在应用程序结束了对引用后,没有人可以引用到它子对象了译注就是里对象再也引用不到了。因此,网页里还有没有对象循环引用,已经点也不重要了,因为这些对象在应用程序都已经不能被访问到了,它们是垃圾了。垃圾回收器在它独立线程上运行,用来从你程序里移除不使用内存。而且在每次运行时,它还会压缩托管堆。压缩堆就是把托管堆中活动对象移到起,这样就可以空出连续内存。图展示了两个没有进行垃圾回收时内存快照。所有空闲内存会在垃圾回收进行后连续起来。图垃圾回收器不仅仅是移动不使用内存,还移除动其它对象,从而压缩使用内存,让出最多空闲内存。正如你刚开始了解,垃圾回收器全部责任就是内存管理。但,所有系统资源都是你自己负责。你可以通过给自己类型定义个析构函数,来保证释放些系统资源。析构函数是在垃圾回收器把对象从内存移除前,由系统调用。你可以,也必须这样来释放任何你所占用非托管资源......”。
9、“.....但是在内存归还之前。这个非确定析构函数意味着在你无法控制对象析构与停止使用之间关系译注对象析构与对象无法引用是两个完全不同概念。关于,本人推荐读者参考下框架程序设计修订版中讨论垃圾回收器。对来说这是个重大改变,并且这在设计上有个重大分歧。有经验程序员写类总在构造函数内申请内存并且在析构函数中释放它们好,坏构造系统需要资源销毁资源使用系统资源生存周期这是种很常见风格,它保证资源无异常释放。但这在里不工作,至少,与这不同。明确析构函数不是环境或者部份。强行用风格在里使用析构函数不会让它正常工作。在里,析构函数确实是正确运行了,但它不是即时运行。在前面那个例子里,代码最终在上,但在里,当析构函数存在时,它并不是在上。它会在后面个未知时间上运行。你不知道是什么时候,你也无法知道是什么时候。依懒于析构函数同样会导致性能上损失......”。
1、手机端页面文档仅支持阅读 15 页,超过 15 页的文档需使用电脑才能全文阅读。
2、下载的内容跟在线预览是一致的,下载后除PDF外均可任意编辑、修改。
3、所有文档均不包含其他附件,文中所提的附件、附录,在线看不到的下载也不会有。