C# 中使用 Powershell 远程调用的内存泄漏

2024-01-10

我有一个 Windows 服务正在执行大量交换远程调用以获取一些服务器信息。我注意到,只要时间过去,服务使用的内存就会开始增长,直到引发内存异常。我已经搜索过,看起来有一个已知的内存泄漏System.Management.Automation这并没有处理掉所有的内存Runspace在调用 close 和/或 dispose 方法时创建。我查看了一篇建议使用CreateOutOfProcessRunspace of the RunspaceFactory但不知道如何使用它。

以下是重现该问题的方法:(System.Management.Automationdll 引用)

for (int i = 0; i < 1000; i++)
{
    var runspace = RunspaceFactory.CreateRunspace();
    runspace.Open();
    runspace.Close();
    runspace.Dispose();
}

如果运行此代码,您将看到内存如何增加。由于要求,尽可能保持连接打开并不是一个好的解决方案。

你知道我如何解决这个问题吗,甚至使用CreateOutOfProcessRunspace的方法RunspaceFactory或者如何正确处理内存?

提前致谢

EDIT

我使用的是 V3 并将运行空间创建更改为使用 CreateRunspacePool 方法,看起来泄漏已经消失了。非常感谢你的帮助!


我可以在 PS v3.0 中看到该问题,但在 PS v2.0 中看不到。这是我用来的代码 请参阅此(所有示例均在 PowerShell 中):

for() {
    $runspace = [runspacefactory]::CreateRunspace()
    $runspace.Open()
    $runspace.Close()
    $p = Get-Process -Id $PID
    '{0} {1}' -f $p.Handles, ($p.PrivateMemorySize / 1mb)
}

上面代码中的 v3.0 看起来句柄和内存正在泄漏。

至于 v2.0 没有这个问题,一种可能的解决方法可能是 使用 PS v2.0 启动服务,即PowerShell.exe -Version 2.0.

如果这是不可能的,我可以想出另外两种解决方法。其中之一不是 直接创建运行空间但使用[powershell]反而。例如,这个 代码在 v3.0 中没有显示泄漏:

for() {
    $ps = [powershell]::Create()
    $p = $ps.AddCommand('Get-Process').AddParameter('Id', $PID).Invoke()
    '{0} {1}' -f $p.Handles, ($p.PrivateMemorySize / 1mb)
    $ps.Dispose()
}

另一种解决方法(如果适用)可以是使用[runspacefactory]::CreateRunspacePool()。这种方式也不会显示 泄露:

$rs = [runspacefactory]::CreateRunspacePool()
$rs.Open()
for() {
    $ps = [powershell]::Create()
    $ps.RunspacePool = $rs
    $p = $ps.AddCommand('Get-Process').AddParameter('Id', $PID).Invoke()
    '{0} {1}' -f $p.Handles, ($p.PrivateMemorySize / 1mb)
    $ps.Dispose()
}
#$rs.Close() # just a reminder, it's not called here due to the infinite loop

最后一个也运行得更快,因为运行空间被重用了。

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

C# 中使用 Powershell 远程调用的内存泄漏 的相关文章

随机推荐

  • JUunit 测试用例中内部图形尚未初始化

    我正在使用 JavaFx 制作一个轻量级绘画应用程序 我的一些问题LayerController类及其方法addLayer所以我认为编写一些 JUnit 测试用例来检查我的方法的正确性是一个好主意 简而言之 我正在画一个Canvas使用它的
  • 如何创建具有格式的字符串?

    我需要创建一个String具有可以转换的格式Int Int64 Double等输入String 使用 Objective C 我可以通过以下方式做到这一点 NSString str NSString stringWithFormat d f
  • MySQL 类似断言的约束

    我是MySQL新手 我刚刚发现它不支持断言 我得到了这张表 CREATE TABLE guest ssn varchar 16 NOT NULL name varchar 200 NOT NULL surname varchar 200 N
  • UIImage 上的圆角

    我正在尝试使用圆角在 iPhone 上绘制图像 就像联系人应用程序中的联系人图像一样 我的代码通常可以工作 但它偶尔会在 UIImage 绘图例程中崩溃EXEC BAD ACCESS KERN INVALID ADDRESS 我认为这可能与
  • 为什么新的 AKSequencer 不发出任何声音?

    我有一个相当复杂的应用程序 到目前为止一直在使用 AKAppleSequencer 但由于该定序器时不时出现一些奇怪的行为和错误 我一直希望迁移到较新的 AKSequencer 不幸的是 新的音序器似乎没有在 Playgrounds 或太多
  • On Key Down 限制用户输入一些特殊字符

    我想限制用户在工具栏搜索中不允许他 她使用一些特殊字符 例如 gt tblFundComp bind keydown function e if e keyCode gt 48 e keyCode lt 57 return false el
  • Spring Security 配置 anyRequest().authenticated() 未按预期工作

    我对spring security配置的理解http anyRequest authenticated 是任何请求都必须经过身份验证 否则我的 Spring 应用程序将返回 401 响应 不幸的是 我的 spring 应用程序不会以这种方式
  • 如何解析命令行参数?

    我想解析 perl 脚本中的参数列表 例如我有这种情况 script pl h 127 0 0 1 u user p pass arg1 arg2 arg3 我该如何解析数组中不是选项的参数列表以及标量值中的选项参数 Thanks 好吧 如
  • 升级 3.0.3 -> 3.2.2 后,NServiceBus 端点寻找 RavenDB 超时

    使用 NuGet 我将项目中的所有 NServiceBus 引用从 3 0 3 升级到 3 2 2 对于此解决方案中的 4 个服务 我还为它们提供了对 NuGet 中的 NServiceBus Host 的引用 我将二进制文件部署到测试环境
  • formik中的submit Form、handleSubmit、onSubmit有什么区别?

    福米克医生说 https jaredpalmer com formik docs guides form submission https jaredpalmer com formik docs guides form submission
  • 从 Roslyn 方法调用中的相应参数获取方法参数的名称

    我想知道是否有一些现有的逻辑可以通过查看该特定方法 构造函数的调用来获取有关其包含的方法 构造函数签名中的参数定义的名称 或任何其他相关信息 基本上 我只是希望能够获得一个变量的默认名称 该名称将作为参数传递给调用 因此 如果一个方法定义如
  • Flexbox 使用align-items: flex-start 和align-content: center

    再会 我正在尝试使用 Flex 框在横轴上包含多余空间的 Flex 容器中强制执行以下行为 如果所有弹性项目都适合一行 那么它们应该在横轴的顶部对齐 但 一旦它们包裹起来 柔性项目应该凝结在横轴的中心 为此 我尝试了以下标记https js
  • 如何构建知识图谱?

    我用 PageRank 制作了一个可以在我的计算机上运行的小型搜索引擎的原型 我有兴趣在其之上构建一个知识图 它应该只返回在正确上下文中的查询网页 类似于谷歌如何找到搜索问题的相关答案 我看到了很多关于知识图的宣传 但没有很多文献 而且几乎
  • WPF 拖放和数据类型

    如何获取掉落物体的类型 如何将其添加到特定的结构 列表中 假设您控制拖动的开始 您不是从另一个应用程序拖动 则类型取决于您 只需使源代码和目标代码匹配即可 在拖动中 通常是 MouseMove 或 MouseDown 处理程序 var dr
  • 删除向量向量内的重复向量

    我有一个向量的向量 loops 其中包含整数值 一些内部向量是重复的 但它们的元素顺序不同 现在 我想获得一个向量的向量 而没有任何重复的内部向量 这是我的 vec 的一个例子 循环 9 18 26 11 9 9 11 26 18 9 9
  • 检查单个字符是否为空格?

    检查单个字符是否为空格的最佳方法是什么 我知道如何通过正则表达式检查这一点 但如果我只有一个角色 我不确定这是否是最好的方法 是否有更好的方法 关于性能 来检查它是否是空格 如果我做这样的事情 我猜我会想念像制表符这样的空白 if ch 如
  • 良好的图库引擎

    最好的开源图片库引擎是什么 既可以独立使用 也可以适用于 Wordpress 或 Drupal 等现有框架 希望随着时间的推移 我们可以在这里建立一个好的列表 Gallery http gallery menalto com是经典的选择 它
  • 网站在 Ipad/Iphone 模拟器与真实设备上的显示不同

    我搜索过很多iPad iPhone simulators 测试了我的网站 网站在几乎所有模拟器上看起来都不错 但是当我在真实的 iPad 中打开网站时 一切都出了问题 由于我无法在设备上检查等 因此很难知道出了问题并且无法进行相应调整 对此
  • 无法进行单元测试:$_SESSION 在每次测试运行之前清空

    我无法对我的代码进行单元测试 每次运行下一个测试时 SESSION 都会清除 当我运行 testStartProductSession 时 我的对象向 SESSION 变量添加一些数据 但是当我运行下一个测试方法 testSessionId
  • C# 中使用 Powershell 远程调用的内存泄漏

    我有一个 Windows 服务正在执行大量交换远程调用以获取一些服务器信息 我注意到 只要时间过去 服务使用的内存就会开始增长 直到引发内存异常 我已经搜索过 看起来有一个已知的内存泄漏System Management Automatio