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
相关产品推荐
相关产品推荐

