btrace を使用して、関数が使用したヒープの量をテストしたいので、次のように記述します。
上記のコードは、私が使用した btrace のサンプルです。
関数を 2 回操作すると、2 つの異なる結果が得られました。
写真が示すように、ヒープ コストは異なります。あるものは別のものの 2 倍です。
メソッドが呼び出される前と呼び出された後の JVM ヒープ使用量を比較しても、特定のメソッドが必要とするメモリの量を知ることはできません。メソッドの実行中にシステム内で多くのことが行われ、取得している数値は、OS から JVM によって割り当てられたメモリを表します。結果からは何もわかりません。
少なくともリモートで使用できるものが必要な場合は、メソッド呼び出し ( Sys.Memory.dumpHeap(fileName) ) の前後にヒープ ダンプを取得し、heapwalker を使用してそれら 2 つを比較する必要があります。それでも、かなりのノイズが発生しますが、OS によって割り当てられたメモリに依存するよりははるかに優れています。
最も正確なメモリ追跡は、メソッドの呼び出し中に作成され、その呼び出しに直接接続されているすべての新しいインスタンスの割り当て情報をキャプチャすることで構成されます。呼び出されたメソッド、追跡されたメソッドから再帰的に呼び出されたすべてのメソッド、および追跡されたメソッド呼び出しツリー内の任意の場所で再帰的に生成されたすべての実行可能なメソッドで作成されます。これを行うのは少し難しいかもしれませんが、BTrace によって完全に達成できます。