You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cmdlet实例的存续时长是多久?自定义派生Cmdlet相关问题

问题答复

  • 关于实例创建规则:你观察到的每次调用新建实例是PowerShell的标准设计,所有Cmdlet(包括微软官方内置Cmdlet)都遵循该规则。该设计的核心目的是保证每次Cmdlet调用的上下文完全隔离,避免前一次调用的残留状态影响后续执行,属于框架层面的刻意设计,并非你代码的问题。
  • 关于实例销毁时机:实例并不会一直堆积到shell退出才销毁。你观察到的析构函数(终结器)直到退出时才执行是.NET 垃圾回收(GC)的固有特性:对象失去所有有效引用后不会被立即回收,GC仅会在内存不足、或手动触发回收时才会扫描销毁无引用对象,并执行终结器。
    你可以通过以下命令手动触发GC验证,连续多次调用Test-Cmdlet后执行以下代码,无需退出shell即可看到terminating日志输出:
[GC]::Collect()
[GC]::WaitForPendingFinalizers()

正常使用场景下这些无引用的Cmdlet实例会被GC自动回收,不会出现内存无限堆积的问题。

  • 关于你的实现疏漏:你的代码本身不存在功能性错误,仅用终结器的执行时机判断对象生命周期的方式不准确。如果你的Cmdlet需要占用非托管资源、需要在执行完成后立即释放,不要依赖终结器,建议让Cmdlet类实现IDisposable接口,PowerShell会在Cmdlet执行完成后自动调用Dispose方法,该释放时机完全可控,不需要等待GC触发。

内容的提问来源于stack exchange,提问作者Chris McAllister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:24:01