web-dev-qa-db-ja.com

Powershellでdispose()を実行しないのはどのくらい悪いですか?

SharePointで小さな管理タスクを実行する必要がある場合があります。単純なPowerShellスクリプトは、そのための非常に優れたツールです。たとえば、そのようなスクリプトはリストのイベントハンドラーを列挙できます。

_[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$site = new-object Microsoft.SharePoint.SPSite($args[0])   
$site.RootWeb.Lists["MyList"].EventReceivers > C:\MyListHandlers.txt
_

SPSiteSPWebなどのオブジェクトは、呼び出し後にDispose()- dでなければならないことがわかっています。そうしないと、メモリリークが発生します。最善は電話することです

_$site.RootWeb.dispose()
$site.dispose()
_

このスクリプトの最後に。しかし、これが一度だけ実行されるPowershellスクリプトであり、PowerShellが実行後にクリーンアップすることがわかっている場合、dispose()を呼び出さないのはとても悪いことですか?

ですから、私の質問は、次のようなスクリプトを実行すると、危険が伴うことです。 SharePointファーム(またはスクリプトを実行しているサーバー)の全体的な安定性に影響しますか?

33
naivists

これは、安全で具体的でない回答を含むように編集されています。

IN GENERAL:すべてを破棄します。Disposeは、.NETフレームワークが外部リソース(ファイルハンドル、TCPポート、データベース接続など)を解放する方法であるためです。 Dispose()を呼び出さない限り、リソースの解放は保証されません。だから注意してください。これは、SharePoint以外の一般的な回答です。

SharePointを使用する場合の具体的な理由:PowerShell.exeプロセスを閉じると、メモリが解放されます。メモリの負荷を抑えるためにオブジェクトを破棄する必要がある場合(運用環境で重要な場合、またはすべてのサイト/ Webをループしている場合)、必ず破棄してください。そうでない場合は、廃棄する必要はありません。

そもそも処分に夢中なのは、ほとんどのSharePointコードが長時間実行プロセス(ASP.NETワーカープロセスまたはOWSTimer.exeのいずれか)で実行され、処分に失敗するとトラブルシューティングが困難になるためです。 、突然の大災害(すなわち、ウェブサーバーがブームになる)。これらの壊滅的なパフォーマンスの問題/ OutOfMemoryExceptionsは、PowerShellで作業しているときはほとんど影響しません。アドホックスクリプトを実行します。オブジェクトの破棄に失敗し、PowerShellウィンドウを閉じてメモリが解放されるため、RAMを3〜50 MB無駄にします。ほとんど問題のない時間。

私はSharePointを操作するためのスクリプトを作成しましたが、ほとんどの場合、気にしません。

これは、SPSiteオブジェクトとSPWebオブジェクトを破棄するスクリプトです

これは、SPSiteオブジェクトを破棄する手間をかけないスクリプトです

17
Peter Seale

理想的には、可能であればDisposeを呼び出す必要があります。 PowerShellの内部でも。

SharePointライブラリには、COMオブジェクトの単なるラッパーである多くのコードが含まれています。また、生活をより楽しくするために、それらのCOMオブジェクトの多くには独自のプールとキャッシュがあります。 Disposeへの.NET呼び出しは、実際には、COMオブジェクトに対して、独自のオブジェクト(呼び出しプロセスの外部に寿命がある可能性がある)を解放できることを指示するだけです。

ここにいくつかのより関連する情報があります: http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx

4
Goyuix

this に従ってください。

それが実行されたメモリを解放する単純なスクリプトであっても、ある時点でそれがより大きなスクリプトの内部ループにコピー/貼り付けされるかどうかはわかりません:-)

正確を期すために、上記のリンクで指定されているSPオブジェクトを常に破棄する必要があります。

3
Ariel

プロセスを閉じるとクリーンアップされますが、注意してください。ファーム内のすべてのサイトを含むループを実行する場合、disposeがないと、大量のメモリがすぐに消費され、サーバーのクロール速度が低下します。スクリプトはバッチ処理に最も役立つため、常にそのことを覚えておいてください。

2
James

シェルが、PowerShellスクリプトの寿命よりも長い寿命を持つ外部リソースにアクセスしている場合は、Disposeを呼び出す必要があります。

ただし、スクリプトによって割り当てられたリソースの場合は、クリーンアップする必要はありません。スクリプトが終了すると、スクリプトに割り当てられたすべてのメモリがクリーンアップされます。

2
Larry Watanabe