1

数百回実行するメソッドを含む静的クラスがあります。現在、メソッドが実行されるたびに、2 つの異なるスタック オブジェクトが作成されます。そのクラスを非静的にして、構築時に 2 つのスタックを作成し、それらをクリアして再利用できるようにすると、より速くなりますか? 答えは、新しいスタック オブジェクトを作成するか、既存のスタック オブジェクトをクリアするか (とにかく空である可能性があります) に依存していると思います。

私は2つのプロファイリングを試みましたが、うまくいかないようですが、それは別の問題です.

4

2 に答える 2

2

コードで静的変数とメソッドをどのように使用するかによって異なります。

インスタンス変数とオブジェクトはヒープに格納されます。ローカル変数はスタックに格納されます。

静的変数は、ヒープ上の永続領域に格納されます。ガベージ コレクターは、オブジェクトにマークを付けてスイープすることで機能します。クラスのロード中は、静的変数をガベージ コレクションに選択できません。それらは、それぞれのクラスローダー (このクラスのロードを担当した) 自体がガベージとして収集されるときに収集できます。

別のアクティビティに渡す値がある場合、静的変数の代わりにインテントを使用します。

カスタム リスト アダプターでは、静的ビューホルダーを使用します。したがって、静的変数またはメソッドの使用は、さまざまな状況に依存します。

MAT アナライザーと呼ばれるツールを使用して、オブジェクトによるメモリ使用量を分析できます。以下のビデオでは、メモリ管理と、メモリ リークを検出して解決する方法について説明しています。

http://www.youtube.com/watch?v=_CruQY55HOk .

   MemoryInfo mi = new MemoryInfo();// current memory usage
  ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  activityManager.getMemoryInfo(mi);
  long availableMegs = mi.availMem / 1048576L;

http://developer.android.com/training/articles/perf-tips.html。パフォーマンスのヒント、特にPrefer Static Over Virtualの下のトピックについては、このリンクを参照してください。

メモリの可用性は、パフォーマンスのために静的変数とメソッドを使用し、メモリ リークを回避することを検討する基準の 1 つです。

于 2013-03-16T15:40:03.363 に答える
0

これは、オブジェクトを再利用しようとすることに関する実際の問題です。メンバーstaticを宣言すると、メソッド内でオブジェクトを再利用することもできます。static個別に: はい、おそらくstatic何もせずにこれを設計する方がよいでしょう。

いずれにせよ、再利用の利点は、オブジェクトの作成を回避できることです。オブジェクトの状態を「クリア」するためのコストがいくらかかかります。そうしないと、Stack.

進行中のメンテナンスの問題があります。オブジェクトに新しい状態を追加し、それをクリアするメソッドを更新することを覚えていましたか?

synchronizeまた、このメソッドにアクセスするか、2 つのスレッドが同時に使用しないようにする必要があります。スレッドがメソッドを同時に実行できないため、ボトルネックが発生する可能性があります。

また、ランタイム全体のメモリに存在するこのオブジェクトのメモリ コストも常に支払います。

昔は、オブジェクトの再作成を避けるために、オブジェクト プールの抽象化を作成していました。これには独自の複雑さと実行時のオーバーヘッドがあり、オブジェクトの作成と GC のコストが現在非常に小さいため、一般的にあまり好まれていません。

パフォーマンスのためだけにオブジェクトを再利用しようとしても、パフォーマンスが向上することはめったにありません。価値があるためには、タイトなループにあり、上記のいくつかの考えられる問題に悩まされない必要があります.

于 2013-03-16T15:48:46.790 に答える