如何指示 PowerShell 对 XmlSchemaSet 等 .NET 对象进行垃圾收集?

2023-11-22

我创建了一个 PowerShell 脚本,该脚本循环遍历大量 XML 架构 (.xsd) 文件,并为每个文件创建一个 .NETXmlSchemaSet对象、调用Add() and Compile()向其中添加架构,并打印出所有验证错误。

该脚本工作正常,但某处存在内存泄漏,导致如果在数百个文件上运行,则会消耗千兆字节的内存。

我基本上在循环中执行的操作如下:

$schemaSet = new-object -typename System.Xml.Schema.XmlSchemaSet
register-objectevent $schemaSet ValidationEventHandler -Action {
    ...write-host the event details...
}
$reader = [System.Xml.XmlReader]::Create($schemaFileName)
[void] $schemaSet.Add($null_for_dotnet_string, $reader)
$reader.Close()
$schemaSet.Compile()

(可以在以下要点中找到重现此问题的完整脚本:https://gist.github.com/3002649。只需运行它,然后在任务管理器或进程资源管理器中观察内存使用量的增加。)

受到一些博客文章的启发,我尝试添加

remove-variable reader, schemaSet

我也尝试拿起$schema from Add()和做

[void] $schemaSet.RemoveRecursive($schema)

这些看似有一定效果,但还是有漏水的情况。我假设较旧的实例XmlSchemaSet仍在使用内存而没有被垃圾收集。

问题:我如何正确地告诉垃圾收集器它可以回收上面代码中使用的所有内存?或者更一般地说:我如何利用有限的内存来实现我的目标?


Microsoft 已确认这是 PowerShell 2.0 中的一个错误,并表示该问题已在 PowerShell 3.0 中得到解决。

问题是使用 Register-ObjectEvent 注册的事件处理程序不会被垃圾回收。在回复支持电话时,微软表示

“我们正在处理 PowerShell v.2 中的一个错误。该问题是由 实际上,.NET 对象实例不再是 由于事件处理程序本身没有被释放而被释放。这 PowerShell v.3 不再重现该问题”。

据我所知,最好的解决方案是在不同级别上连接 PowerShell 和 .NET:完全使用 C# 代码(嵌入 PowerShell 脚本中)进行验证,然后传回一个列表ValidationEventArgs对象。请参阅固定复制脚本:https://gist.github.com/3697081:该脚本功能正确并且不会泄漏内存。

(感谢 Microsoft 支持帮助我找到此解决方案。)


最初微软提供了另一种解决方法,即使用$xyzzy = Register-ObjectEvent -SourceIdentifier XYZZY,然后最后执行以下操作:

Unregister-Event XYZZY
Remove-Job $xyzzy -Force

However,此解决方法在功能上不正确。执行这两个附加语句时,任何仍在“进行中”的事件都会丢失。就我而言,这意味着我错过了验证错误,因此我的脚本的输出不完整。

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

如何指示 PowerShell 对 XmlSchemaSet 等 .NET 对象进行垃圾收集? 的相关文章

随机推荐

  • 为单个 Jenkins 作业构建多个 Maven 配置文件

    我正在尝试在单个 Jenkins 作业中构建多个 Maven 配置文件 每个配置文件都会更改一些代码 然后通过执行创建一个 jarmvn Pdev install then mvn Pprod install在命令行中 根据 Maven 使
  • 不能写成 for 循环的 while 循环示例

    我知道 while 循环可以做 for 循环可以做的任何事情 但是 for 循环可以做 while 循环可以做的事情吗 请举个例子 是的 很容易 while cond S for cond S
  • 将新字段更新到现有文档

    是否可以将新字段更新到现有文档 例如 有一个包含多个字段的文档 例如 ID 99999 Field1 text Field2 text 该文档已经在索引中 现在我想在该文档中插入一个新字段 而不使用旧数据 ID 99999 Field3 t
  • 查找流星集合中的最新条目

    我的任务听起来很简单 但我无法确定如何编写这个 我只想找到插入集合中的最新项目并将其显示在我的流星应用程序上 我一直在使用 Collection find 但没有任何实际结果 这是我尝试过的最后一行 请记住这些名称是占位符 我的集合在我的代
  • 我如何在 make 目标之间传递 ENV 变量

    我在 makefile 中有这样的 target1 export var1 test MAKE target2 target2 echo var1 这是空的 我有其他依赖项 所以我想在第一个目标中设置变量 然后所有子依赖项应该能够访问该变量
  • 如何避免动态调度?

    我有以下特点 struct ArtistInfo some fields pub trait Fetcher fn fetch self artist String gt ArtistInfo 我想要有几个不同的获取器 可以在不同的情况下使
  • 从 ggplot 中删除 n 个图例

    我试图从下面的图中删除 n 图例 我猜这与stat部分geom bar 但我不完全确定它显示的内容 因此不知道如何删除它 我确实想要填充图例show legends FALSE不是正确的选择 抱歉 如果这是重复的 但之后 我找了很多找不到答
  • 为什么我收到“无法加载扩展。‘content_security_policy’值无效”?

    我正在尝试创建一个 chrome 扩展 我的清单文件是 name Alert Beep action manifest version 3 version 0 1 description Beeps if alert is called c
  • 带有 Fragments 和 FragmentActivity 的 TabHost

    我正在开发一个 Android 应用程序 我想使用 3 个选项卡进行导航 每个选项卡使用片段 但我不知道如何创建执行此操作的结构 我想单独添加每个片段 因为每个片段都不同 但我不知道在 FragmentActivity 中的哪里添加它们 我
  • 在 Android Studio (cmake) 中使用预构建的共享库

    我想在我的 Android 应用程序中使用 C 共享库 我试图遵循hello libs来自 Google NDK 样本的示例 但不知何故它不起作用 看来我的库没有打包到 APK 中 我发现的所有教程都在使用 mk 文件 但我想使用cmake
  • 我应该如何保护 iOS 中的 SQLite 数据库?

    我正在开发一个医疗保健 iOS 应用程序 我希望对用户的数据进行加密 这样如果他们的 iPhone 被盗 窃贼将无法访问他们的健康信息 合法所有者应该能够访问他们的信息 与这个问题 我正在考虑使用SQL密码加密整个数据库 并将SQLCiph
  • Netty客户端到服务器的消息

    这实际上是我在这里发表的第一篇文章 我已经尝试解决这个问题有一段时间了 但我终于调用了flag 并尝试在这个主题上获得一些帮助 所以我有一个客户端和一个服务器 它们是根据回显客户端 服务器和安全聊天客户端 服务器建模的 我对聊天的 SSL
  • Jackson 可以与 Spring MVC 3.0 一起使用来将 RequestBody 绑定到 Java Bean 吗?

    我有一个非常简单的问题 但我似乎找不到简单的答案 我让杰克逊开始连载爪哇豆 to JSON in the response using ResponseBody 但我没能序列化回来JSON to 爪哇豆 in the request usi
  • Azure API 管理 - 如何保护订阅密钥

    技术栈 API部署在WebApp中 部署 API 管理并将 WebApp 配置为 Web 服务 URL UI 在 Angular 应用程序中开发 该应用程序调用 API 管理端点以在 UI 上显示数据 实施 IP 身份验证以确保只有允许的用
  • 用于过滤列表的组件

    什么 Java Swing 组件适合创建如下所示的可过滤列表 这种类型的过滤最容易使用单列完成JTable 表具有内置功能来添加RowSorter which 提供排序的基础和过滤 也可以看看如何使用表格 排序和过滤 以下是过滤字体系列名称
  • Webusb:尝试在 Windows 上打开打印机时访问被拒绝

    我试图允许 POS Web 应用程序使用 Chrome webusb API 直接打印到 StarMicronics 或任何收据打印机 我正在使用这个例子here几乎完全一样 除了我修改了vendorId过滤到 StarMicronics
  • 将日期时间字符串转换为 R 中的 POSIXct 日期/时间格式

    考虑格式中的字符串 test lt YYYY MM DDT00 00 00 000 08 00 我的目标是将这些字符串转换为POSIXct格式 以便我可以绘制数据 我最初的想法是使用 as POSIXct test 但这似乎将日期时间截断为
  • 使用 JUnit 5 运行 Groovy 测试用例

    也许这很简单 但我在网上找不到任何示例 我想使用 JUnit 5 运行作为 Groovy 类实现的单元测试 我当前的设置似乎启动了 JUnit 5 但无法检测到测试用例 IntelliJ 识别测试 但无法运行它 如果我添加 Java 单元测
  • AttributeError:“模块”对象没有属性“分数”

    我在尝试使用该函数时遇到错误precision from nltk metrics scores 我尝试了许多不同的进口但没有成功 我查看了 python 目录中的文件 见下文 该函数就在那里 但只是 无法触及这个 那个 我在看 usr l
  • 如何指示 PowerShell 对 XmlSchemaSet 等 .NET 对象进行垃圾收集?

    我创建了一个 PowerShell 脚本 该脚本循环遍历大量 XML 架构 xsd 文件 并为每个文件创建一个 NETXmlSchemaSet对象 调用Add and Compile 向其中添加架构 并打印出所有验证错误 该脚本工作正常 但