5

コード (Java で記述) から関数を呼び出していますが、その関数が使用しているメモリの量を知りたいのですが、(呼び出している) 関数にコードを追加できないことに注意してください。

たとえば-

 //my code starts
   .
   .
   .
   .
   myfunc();
 //print memory used by myfunc() here
  .
  .
 // my code ends

これを行う方法?

4

3 に答える 3

7

あなたがやろうとしていることは、基本的に無意味です。関数によって使用されるメモリのようなものはありません。関数呼び出しの「前」と「後」の総メモリ使用量を比較するというあなたの考えには意味がありません。増加を「関数によって使用されるメモリ」と見なしたくない)、またはガベージ コレクタが実行されている間にガベージ コレクタが実行され、使用されているmyfuncメモリの合計が減少する可能性があります。

良い質問には、多くの場合、回答の大部分が含まれています。あなたがすべきことは、正しく質問することです。

于 2012-04-17T06:46:04.753 に答える
1

私はこのコードで成功しました(動作することは保証されていませんが、試してみると、必要なものが得られる可能性が高くなります):

final Runtime rt = Runtime.getRuntime();
for (int i = 0; i < 3; i++) rt.gc();
final long startSize = rt.totalMemory()-rt.freeMemory();
myFunc();
for (int i = 0; i < 3; i++) rt.gc();
System.out.println("Used memory increased by " +
   rt.totalMemory()-rt.freeMemory()-startSize);
于 2012-04-17T07:58:26.070 に答える
0

しかし、理想的には減算後は常にゼロであるべきなので、それは間違っています。

通常、各スレッドにはTLAB(Thread Local Allocation Buffer)があり、ブロック単位で割り当てるため(各スレッドが同時に割り当てることができるため)、実際にはその権利があります。

これをオフにする-XX:-UseTLABと、割り当てられたバイトが表示されます。

この関数を使用すると他のものが実行されている可能性があるため、これを複数回実行する必要があります。

于 2012-04-17T07:12:41.983 に答える