最近、ASP.NET アプリケーションに次のような行がたくさんあることがわかりました。
Label lbXXX = (Label)FormView.FindControl("lbXXX");
TextBox
、Panel
、Image
、DropDownList
...についても同じ
これがメモリリークの原因でしょうか?
私が思うほど悪いですか?
最近、ASP.NET アプリケーションに次のような行がたくさんあることがわかりました。
Label lbXXX = (Label)FormView.FindControl("lbXXX");
TextBox
、Panel
、Image
、DropDownList
...についても同じ
これがメモリリークの原因でしょうか?
私が思うほど悪いですか?
メモリ リーク、ここでは不可能です。はい、検索コントロールを過度に使用することはお勧めしません。このようなインシデントを多数観察しているため、それらを解決してコードをクリーンアップすることをお勧めします。パフォーマンスも、現在の検索コントロールにヒットしています。
これがメモリ リークを引き起こしている可能性は低いです。
メモリ リークの原因を特定するには、メモリ プロファイラを使用して、保持すべきではない参照を保持しているものを特定する必要があります。
.NET でメモリ リークが発生する最も一般的な原因は、イベント ハンドラーが登録解除されていないことです。ただし、ASP.NET では、スレッド モデルごとの要求により、これは問題にならない傾向があります。
メモリ リークが疑われる場合 (どのようにしてメモリ リークがあると判断したのですか?)、理由を見つけるためにプロファイルを作成してください。想定しないでください。
メモリの問題が発生する可能性は低いです。ただし、コストがかからないわけではありません。
以下に示すように、最初のアクションは、まだ作成されていない場合にEnsureChildControls
呼び出すものです。CreateChildControls
これにより、パフォーマンス/メモリの問題が発生する可能性があります。
ASP.NET ページ フレームワークによって呼び出され、コンポジション ベースの実装を使用してサーバー コントロールに通知し、ポスト バックまたはレンダリングの準備として含まれる子コントロールを作成します。
その後、FindControl
この問題は発生しませんが、カスタム コントロールです。
これは実装です(ILSpyから):
protected virtual Control FindControl(string id, int pathOffset)
{
this.EnsureChildControls();
if (!this.flags[128])
{
Control namingContainer = this.NamingContainer;
if (namingContainer != null)
{
return namingContainer.FindControl(id, pathOffset);
}
return null;
}
else
{
if (this.HasControls())
{
this.EnsureOccasionalFields();
if (this._occasionalFields.NamedControls == null)
{
this.EnsureNamedControlsTable();
}
}
if (this._occasionalFields == null || this._occasionalFields.NamedControls == null)
{
return null;
}
char[] anyOf = new char[]
{
'$',
':'
};
int num = id.IndexOfAny(anyOf, pathOffset);
string key;
if (num == -1)
{
key = id.Substring(pathOffset);
return this._occasionalFields.NamedControls[key] as Control;
}
key = id.Substring(pathOffset, num - pathOffset);
Control control = this._occasionalFields.NamedControls[key] as Control;
if (control == null)
{
return null;
}
return control.FindControl(id, num + 1);
}
}