Windows 2016サーバー/ Windows 10クライアントにKB4525236をインストールした後、メモリ不足の問題が発生します。このセキュリティ修正により、から関数を呼び出すときにメモリがガベージコレクションされる瞬間が変わったようGetRef
です。
プレKB4525236
を通じて呼び出された関数で作成された各インスタンスGetRef
は、インスタンス変数が次のように設定されるとすぐにガベージコレクションされます。nothing
KB4525236の投稿
関数で作成された各インスタンスGetRef
はメモリに残り、関数全体が完了するまでガベージコレクションされません。ループでインスタンスを作成すると、特に32ビットプロセスでは、これがすぐに加算されてメモリ不足につながる可能性があります。
ご質問
- オンラインで関連するものを見つけることができないので、同じ問題が発生している他の人から確認を得たいと思います。スクラッチを
編集:これは同じ問題ですが、現時点で解決策はありません
(KB4524570(2019年11月12日)Windows 10 1903以降のvbscript.dll class_terminateバグ) - 誰かが検証して実行可能なソリューションを知っていれば、それは素晴らしいことです。
POC
KB4525236がインストールされているデバイスで実行されている次のスクリプトは、次の場合のガベージコレクションの違いを示しています。
- 直接呼び出されます:最初のインスタンスが破棄された後にのみ2番目のインスタンスが作成されます(これは私たちの望ましい動作です)
- コールスルー
GetRef
:最初のインスタンスが破棄される前に 2番目のインスタンスが作成されるため、メモリを使用する2つのインスタンスがあります。
名前を付けて保存:KB4525236.vbs
として実行:wscript KB4525236.vbs
Dim Name, Log
Class IDummyInstance
Dim FName
Sub Class_Initialize
FName = Name
Log = Log & "Initialize " & FName & VbNewLine
End Sub
Sub Class_Terminate
Log = Log & "Terminate " & FName & vbNewLine
End Sub
End Class
Sub CreateDestroyTwoInstances
Dim DummyInstance
Name = "First Instance"
Set DummyInstance = New IDummyInstance
Set DummyInstance = Nothing
Name = "Second Instance"
Set DummyInstance = New IDummyInstance
Set DummyInstance = Nothing
End Sub
Log = "(1) Direct Call :" & VbNewLine
Call CreateDestroyTwoInstances
Log = VbNewLine & Log & "(2) GetRef Call :" & vbNewLine
Set GetRefCall = GetRef ("CreateDestroyTwoInstances")
Call GetRefCall
MsgBox Log
明確にしていただきありがとうございます。そのtbhについて何ができるかわかりません。だれかが知っているとしたら、VBScriptを作成した元のチームで働いていた@ eric-lippertだと想像してください。
—
Lankymart
@GSerg-たまたまこれを報告するチャンネルがありますか?どこに問題を報告するかを理解しようとするほど、私には何も速くは届きません。このサポートページ に例のリード線のため、このサポートページ効果的に何にもつながります。
—
Lieven Keersmaekers
GetRef()
までガベージコレクションされないことGetRef()
です。それはそれが何であったかとは異なります。GetRef()
1000のインスタンスを作成することによって呼び出される関数GetRef()
があり、それらは過去までメモリを蓄積し続けますが、過去には、でループを実行している間に解放されましたGetRef()
。