我正在阅读“The C# Language”,第 4 版,它讨论垃圾收集如下:
"BILL WAGNER: The following rule is an important difference between C# and other managed environments.
Prior to an application’s termination, destructor's for all of its objects that have not yet been garbage collected are called, unless such cleanup has been suppressed (by a call to the library method GC.SuppressFinalize, for example)."
所以我有几个问题:
问题 1。为什么 .net 在这里不同于其他托管环境(我想这是在暗示 Java?)?有什么特别的设计问题吗?
问题 2。调用 GC.SuppressFinalize 的对象会发生什么情况?
我知道这意味着 GC 不会调用此类对象的终结器(析构函数),如果是这样,这些对象何时会真正被销毁,以便分配的内存位返回到堆中?不然会内存泄漏吗?
最佳答案
What will happened to objects that GC.SuppressFinalize is called? I understand that this means GC will not call such objects' finalizer (destructor), if so, when will these objects got really destructed? otherwise there'll be Memory Leak right?
你对finalization的用途有误解。终结是为了清理不是托管内存的资源。
假设您有一个包含整数字段的引用类型对象。该整数字段恰好是通过调用非托管代码打开文件而获得的文件句柄。
由于某些其他程序可能想要访问该文件,因此尽快关闭该文件是礼貌的做法。但是 .NET 运行时不知道这个整数对操作系统有什么特殊意义。它只是一个整数。
解决此问题的方法通常是将对象标记为实现 IDisposable,然后在完成处理后立即对该对象调用“Dispose”。然后您执行“Dispose”关闭文件。
请注意,这里没有什么特别的事情发生。清理非托管资源的方法称为“Dispose”,需要处置的对象实现 IDisposable 只是一种约定。垃圾回收对此一无所知。
那么现在问题来了:如果有人忘记调用 Dispose 怎么办?文件是否永远保持打开状态? (明明进程结束时文件会被关闭,但是进程运行时间长了怎么办?)
要解决这个问题,您可以使用终结器。它是如何工作的?
当一个对象即将被垃圾回收时,垃圾回收器会检查它是否有终结器。如果是这样,那么它不会对它进行垃圾回收,而是将它放在终结器队列中。在未来某个未指定的时间点,运行一个线程来检查队列并在每个对象上调用一个特殊的“Finalize”方法。之后,对象从终结队列中移除并标记为“嘿,我已经被终结了”。该对象现在再次符合收集条件,因此垃圾收集器最终会运行并收集该对象, 不会将其放入终结队列。
很明显,“Finalize”和“Dispose”经常需要做同样的事情。
但是现在另一个问题出现了。假设您处理一个对象。 现在不需要定稿了。 定稿很昂贵;它使死对象存活的时间比需要的时间长得多。因此,传统上处理一个对象时,Dispose 的实现不仅会关闭非托管资源,还会将该对象标记为“该对象已经被终结,不要再次终结”。这样它就可以诱使垃圾收集器不将对象放入终结队列。
那么让我们回答您的具体问题:
What will happened to objects that GC.SuppressFinalize is called?
当对象死亡时,垃圾收集器将简单地回收对象的内存,而不会将对象放入终结器队列。
I understand that this means GC will not call such objects' finalizer
GC 从不 调用终结器。终结器线程是唯一调用终结器的线程。
when will these objects got really destructed?
不清楚您所说的“破坏”是什么意思。如果您的意思是“终结器何时运行?”答案是“从不”,因为你说过要抑制最终确定。如果你的意思是“什么时候回收托管堆中的内存?”,答案是“一旦对象被垃圾收集器识别为死亡”。这将比正常情况更快发生,因为终结器队列不会使对象保持事件状态。
关于C#语言 : Garbage Collection, SuppressFinalize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6652044/
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby有很大不同。由于我与ruby之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?
如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback
在我的双语Rails4应用程序中,我有一个像这样的LocalesController:classLocalesController用户可以通过此表单更改其语言环境:deflocale_switcherform_tagurl_for(:controller=>'locales',:action=>'change_locale'),:method=>'get',:id=>'locale_switcher'doselect_tag'set_locale',options_for_select(LANGUAGES,I18n.locale.to_s)end这有效。但是,目前用户无法通过URL更改