corner imagecorner image FeaturesPluginsPlatformDocs & SupportCommunityPartners

半統計的メモリープロファイル

メモリープロファイルでの半統計的データ収集

Profiler によって表示される各クラスの割り当てオブジェクトの総数は (「オブジェクト作成のみ記録」モードと「オブジェクト作成とガベージコレクションの両方を記録」モードのどちらも) 正確です。これに対して、その他の数 (合計のオブジェクトサイズなど) や逆呼び出しグラフは、デフォルトでは統計的に取得されます。これは、Profiler で使用可能な多くの強化されたパフォーマンス測定の 1 つです。

統計的データ収集は次のように動作します。プロファイルされる各種類 (つまり、クラスまたは配列の種類) に関連付けられたカウンタが存在し、最初は 10 に設定されます (このデフォルト値は、「メモリー使用を解析」コマンドダイアログまたはカスタムメモリープロファイルで変更できる)。特定のクラスのインスタンスが割り当てられるたびに、このカウンタは減分されます。このカウンタがゼロに達すると、割り当てオブジェクトのサイズが特定され、スタックトレースが収集されて、再度カウンタに初期値が割り当てられます。Profiler に表示されるオブジェクト割り当ての逆呼び出しグラフはこれらのスタックトレースから作成され、Profiler によって報告されるオブジェクトの合計サイズは、スタックトレースが収集されたオブジェクトのみのサイズです。

また、割り当て呼び出しグラフに表示されるメソッド呼び出しの回数が、CPU プロファイルに表示される回数とは異なる点にも注意してください。メモリープロファイルの場合、これらの数は、実際には特定のメソッドが呼び出された回数ではなく、特定のコンテキストでこのメソッドがスタック上で見つかったときにスタックトレースが収集された回数です。そのため、たとえば、main アプリケーションメソッドが複数回呼び出されていることが見つかる場合があります。実際に、アプリケーションがシングルスレッドであれば、main メソッドに表示される「呼び出し」の総数は、収集されたスタックトレースの総数と同じになります。

統計的データ収集を使用した場合は、当然、呼び出しパスの一部に関する情報が失われる可能性があります。ただし、実際には、一般的にもっともアクティブなオブジェクト割り当て位置や呼び出しパスのみを特定することが重要です。これらは、上で説明した統計的スタック抽出でも明確になります。呼び出しパスに関する正確な情報を収集する必要がある場合は、スタック抽出間隔の値を 1 に設定するだけで済みます。ただし、これにより、パフォーマンスが目に見えて低下する場合があります。収集される情報の精度とパフォーマンスへの影響の間の妥当な折衷案として、10 に等しいデフォルトのスタック抽出間隔が選択されています。

また、この種のプロファイル中には、Profiler が厳密に固定されたスタック抽出間隔を使用しない点にも注意してください。これは、好ましくないデータ相互関係を回避するために実行されます。たとえば、プログラム内に、X のインスタンスの割り当てをメソッド foo() 内で連続して 9 回発生させ、次にメソッド bar() 内で 1 回発生させる 1 つのループが含まれている場合、X の 10 回の割り当てごとに正確にスタックを抽出すると、bar() で発生する割り当てに関する情報のみが取得され、foo() に関しては何も得られないというかなり歪曲された結果になる可能性があります。この問題を解決するために、Profiler はスタックトレースを収集するたびに、オブジェクト割り当てのカウンタを、ユーザーが定義した値とは少し異なるランダムな値に設定します。定義された間隔が 10 の場合は、Profiler の実行に従ってカウンタの実際の開始値は、たとえば、8、11、10、7、9、12、... のようになります。このようにして、最終的にユーザーに提供される情報が、一般に統計的に信頼性できるものであることが保証されます。

関連項目

 

Project Features

About this Project

Profiler was started in November 2009, is owned by Tomas Hurka, and has 44 members.
 
 
Close
loading
Please Confirm
Close