GC 行为和 CLR 线程劫持

2024-05-25

我在书中读到关于GC的内容CLR via C#,特别是关于 CLR 何时想要开始收集。我知道它必须在收集发生之前挂起线程,但它提到当线程指令指针到达安全点时它必须执行此操作。在它不在安全点的情况下,它会尝试快速到达安全点,并且这样做是通过hijacking线程(在线程堆栈中插入特殊函数指针)。这一切都很好,但我认为默认情况下托管线程是安全的?

我最初以为它可能指的是非托管线程,但 CLR 允许非托管线程继续执行,因为任何正在使用的对象无论如何都应该被固定。

那么,什么是safe point在托管线程中,GC 如何确定那是什么?

EDIT:

我认为我说得不够具体。根据这篇 MSDN 文章 http://msdn.microsoft.com/en-us/library/678ysw69.aspx,即使当Thread.Suspend被调用时,线程实际上不会被挂起,直到safe point到达了。它继续进一步指出safe point是线程执行中可以执行垃圾收集的点。

我想我的问题不清楚。我意识到线程只能在安全点挂起,并且必须在 GC 时挂起它们,但我似乎无法找到关于什么是安全点的明确答案。什么决定代码中的点是安全的?


“安全点”是我们所处的位置:

  1. 不在 catch 块中。
  2. 不在finally里面
  3. 不在锁内
  4. 不在 p/invoke'd 调用内(在托管代码中)。 不在 CLR 中运行非托管代码。
  5. 记忆树是可行走的。

第 5 点有点令人困惑,但有时内存树将无法行走。例如,优化后,CLR 可能会新建一个对象,而不是将其直接分配给变量。根据 GC 的说法,该对象将是一个准备被收集的死对象。当发生这种情况时,编译器将指示GC尚未运行GC。

这是 msdn 上的一篇博客文章,其中包含更多信息:http://blogs.msdn.com/b/abhinaba/archive/2009/09/02/netcf-gc-and-thread-blocking.aspx http://blogs.msdn.com/b/abhinaba/archive/2009/09/02/netcf-gc-and-thread-blocking.aspx

编辑:好吧,先生,我对#4 的看法是错误的。看here http://msdn.microsoft.com/en-us/magazine/bb985011.aspx在“安全点”部分。如果我们位于 p/invoke(非托管)代码部分内,则允许它运行,直到它再次返回到托管代码。

然而,根据这篇 MSDN 文章 http://blogs.msdn.com/b/stevenpr/archive/2004/07/26/197254.aspx,如果我们处于 CLR 代码的非托管部分,那么它不被认为是安全的,它们将等到代码返回到托管状态。 (至少我很接近)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GC 行为和 CLR 线程劫持 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 如何在mapbox-gl中自定义集群图标?

    我想在我的地图中实现聚类 我找到了简单聚类的示例Mapbox 集群示例 https www mapbox com mapbox gl js example cluster but 我的代码在这里 http pastebin com x2kF
  • Struts 2 Action 标签,检索属性

    如果我有一个典型的设置 其中包含转发到 JSP 的操作 我会像这样请求我的属性
  • 错误:找不到进程“node.exe”

    完整的错误是 ERROR The process node exe not found The filename directory name or volume label syntax is incorrect Finished in
  • 如何为 pageAction 添加点击?

    第一次延期 请友善 我的目标是在用户访问来自特定域的页面时提供一个选项 以提供启动另一个页面的选项 该页面使用所访问页面的域名的一部分作为变量 下面的代码执行了我想要的操作 但它没有提供该操作作为选项 它只是执行 当访问与域匹配的页面时 它
  • 调用 cat 时 shell 脚本挂起

    我有一个 shell 脚本 它通过电子邮件向我发送通过 crontasks 遇到的错误 如下所示 exec gt output cat shopt s nocasematch if output error output warning t
  • 文件所有者图标

    我花了太多时间寻找文件所有者图标以单击拖动到文本字段以将变量分配给该字段 然后我突然意识到该图标只显示在 nib 文件上 不是故事板 那么将变量分配给文本字段的选项是什么 硬编码 我想做的是在主屏幕上的两个文本字段中显示当前位置的连续坐标
  • Safari 中透明颜色会发生什么情况?

    有一个块 其中接近末尾的文本逐渐消失 这是使用以下方法完成的 after 给定linear gradient从透明色到背景色 最近注意到 在当前版本的浏览器中 除了 safari 之外 一切都很好 在第 11 版中 情况太糟糕了 Autop
  • 如何将 RFC 2822 日期/时间解析为 Python 日期时间?

    我有 RFC 2822 指定的表格日期 比如说Fri 15 May 2009 17 58 28 0000 作为字符串 有没有一种快速和 或标准的方法来将其作为datetimePython 2 5 中的对象 我尝试生成 strptime 格式
  • 忽略控制台应用程序中的 Web 浏览器 SSL 安全警报

    我正在创建一个能够远程捕获网站屏幕截图的控制台应用程序 除了我无法避免证书错误之外 一切都正常 每次我收到无法通过的弹出消息 我尝试使用 ServicePointManager ServerCertificateValidationCall
  • 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称

    我使用 SinkWriter 来使用媒体基础对视频进行编码 初始化 SinkWriter 后 我想获取它使用的底层编码器 并打印出它的名称 这样我就可以看到它使用的编码器 就我而言 编码器很可能是H 264 视频编码器 http msdn
  • 维克斯。相同版本不同产品代码如何进行重大升级?

    基本上我需要改变这种行为 安装具有相同版本和升级代码的产品 但 不同的产品代码 是允许的 并被 MSI 视为两种产品 我需要将其作为重大升级进行威胁 因此 在 v 1 0 1 旧版本 不同的 ProductCode 上安装 v 1 0 1
  • 全屏模式下的 XBAP

    我想以全屏模式运行 XBAP 有没有办法让IE全屏打开XBAP 由于我以完全信任的方式运行 每当用户单击全屏按钮时 我都会使用 Process Start 方法以 kiosk 模式打开 IE 以下代码解决了我的问题 Process Star
  • IdentityServer3 与 ServiceStack 和 MVC 客户端

    我是 IdentityServer3 的新手 刚刚开始设置它 似乎进展顺利 我一直在为 MVC 应用程序开发混合流程 类似于 Kevin Dockx 的 Pluralsight 课程中所示的内容 http www pluralsight c
  • 在 ndb tasklet 中使用 images.get_serving_url_async() 是否安全?

    NDB 小线程和yield是执行异步 并行代码的好方法 然而 从文档中还不清楚这种机制是否可以安全地与非 ndb 异步函数一起使用 例如images get serving url async The NDB 异步操作文档页面 https
  • C# webBrowser 脚本错误

    尝试使用以下命令加载页面时 我不断收到脚本错误webBrowser Navigate https home nest com 它可以从我的普通互联网浏览器中正常启动 但不能在我的程序中正常启动 有人能指出我正确的方向吗 as 这个链接 ht
  • 如何根据子宽度设置 div 的宽度?

    我想使用 HTML 和 CSS 创建一个类似于 UI 的线程视图 聊天收件箱 http jsfiddle net 7mbaksvj http jsfiddle net 7mbaksvj 我的问题是 div 的宽度 它以固定宽度的形式出现 但
  • 如果我传入的日期格式为 YYYYMMDD,则将字符串转换为 .NET 中的日期

    如果我传入的日期格式为 C 中将字符串转换为日期的最佳方法是什么YYYYMMDD Ex 20001106 使用 DateTime ParseExact 就像是 string date 20100102 DateTime datetime D
  • 如何在 NHibernate 中使用 READPAST 提示?

    有什么办法可以让 NHibernate 使用吗the READPAST hint https learn microsoft com en us sql t sql queries hints transact sql table从 SQL
  • 使用 select2 的多个选择元素无法正常工作

    请注意 这不是关于
  • GC 行为和 CLR 线程劫持

    我在书中读到关于GC的内容CLR via C 特别是关于 CLR 何时想要开始收集 我知道它必须在收集发生之前挂起线程 但它提到当线程指令指针到达安全点时它必须执行此操作 在它不在安全点的情况下 它会尝试快速到达安全点 并且这样做是通过hi