1

私はアンドロイドのために計算しています。私のプログラムは大量のデータを扱っており、ガベージ コレクタが非常にビジーであるように見えるため、メモリ リークに注意するようにしています。

私は違いがあるのだろうかと思っていました:

for (int i=0;i<200;i++) 
{
   MyObject myobject = new MyObject(i,i+1);
   myobject.writeToDatabase();
}

MyObject myobject=null;
for (int i=0;i<200;i++) 
{
    myobject = new MyObject(i,i+1);
    myobject.writeToDatabase();
}

そして(コンストラクターの使用を避ける)

MyObject myobject=new MyObject(0,1);
myobject.writeToDatabase();
for (int i=1;i<200;i++) 
{
   myobject.setFirstValue(i);
   myobject.setSecondValue(i+1);
   myobject.writeToDatabase();
}
4

1 に答える 1

3

3 番目のオプションが断然最適です。他の 2 つのオプションは、そのコンテキストでは、Java ではほとんど同じです。

毎回新しいオブジェクトを作成するのではなく、古いオブジェクトを再度使用すると、ガベージ コレクターの多くの作業が軽減されます。これは、パフォーマンスとメモリ管理をより効率的にする良い方法です。

最初の 2 つのオプションでは、基本的に同じことを行っています。つまり、ループの開始時に新しいオブジェクトを作成し、ループの終了時にそれを破棄します。ポインターに同じ変数を使用し続けるという事実は、大きな違いはありません。

編集:

Stochasticallyで述べたように、ガベージ コレクターがメモリ リークを起こさないようにするため、コードでメモリ リークが発生することはありません。結局のところ、メモリ リークを発生させるにはいくつかのトリックがあると思いますが、通常の状況では発生しません。しかし、説明したように、使用するオブジェクトを減らすことで、ガベージ コレクションをより効率的にする方法はまだあります。

于 2013-04-13T17:39:07.063 に答える