0

私の Android アプリには多くの配列が必要です。GC を防ぐために、Javolution.arrayFactoryを使い始めました。
しかし、alloc次のように1つのスレッド呼び出しで記憶した場合。

byte []buffer = ArrayFactory.BYTES_FACTORY.array(size); 

そして、次のような別のスレッドで解放します。

ArrayFactory.BYTES_FACTORY.recycle(buffer); 

次に、メモリリークを引き起こします。配列のプールを実現するライブラリまたはクラスだけが必要です。

4

1 に答える 1

1

多くの byte[] を割り当てる代わりに、通常、動的にリサイクルするのではなく、それらを再利用する方法があります。

たとえば、Socket ハンドラ オブジェクトがあり、それが byte[] を持っているとします。byte[] を一度作成すると、これを接続の存続期間中保持できます。

複数の場所に分割された ByteBuffer を使用して、同じバイト配列を使用して複数のバッファーを作成できます。

または、オフ ヒープ メモリなど、設計した構造を使用してデータを保存することもできます (これは、Android よりも JVM の方がうまく機能すると思います)。

以前は多くのことをリサイクルしてbyte[]いましたが、さまざまなプロジェクトでそれらすべてを事前に割り当てられたバッファーまたは長寿命のバッファーに置き換える方法が見つかり、これにより CPU オーバーヘッドが大幅に削減されました。

于 2012-08-07T08:20:46.220 に答える