継続的に実行されているスレッドの run() から継続的に呼び出される次の関数があります。
private LinkedList<short[]> playerData = new LinkedList<short[]>();
public synchronized void setPlayerData(short[] buffer) {
// Log.i(LOG_TAG, "Inside setData..");
playerData.addLast(buffer);
if (playerData.size() > 10) {
// Log.i(LOG_TAG, "playerData not empty");
playerData.removeFirst();
}
}
現在、DDMS の割り当てトラッカーは、多くのオブジェクトが addLast() 内 (実際には addLastImpl() 内) で作成されていることを示しています。そのため、配列を明示的に削除して、ヒープに常に十分なメモリを確保したいと考えています。今、
- System.gc() オプションは、setPlayerData() へのすべての呼び出しで同時に呼び出されるため、役に立ちません。
- GC_CONCURRENT はすべての CPU サイクルを消費しています。これは、アプリが時間に非常に敏感であり、数ミリ秒の遅延でさえ許容できないためです。
LogCat の情報については、リンクを参照してください。これは、シナリオン全体に対処する別の質問です。このスレッドでは、小さな問題のセットに分割することで、その大きな問題を解決しようとしています。
考えられる解決策考えられる解決策は、不要な配列を削除してメモリ空間を明示的に解放することです。new
しかし、Java では、演算子によって作成された配列をどのように解放できますか? すなわち
short[] buffer = new short[320];
// do some operation on buffer
/// now how can I explicitly free memory by deleting the buffer, when its job is over..
そのようなことすべてを処理するためのガベージコレクションがあることを私は知っています。しかし、私のアプリではGC_CONCURRENTが常に食い尽くしています。これにより、他のプロセスが枯渇します。メモリを明示的に解放できる、つまり C++ で削除できればよかったのにと思います。ここで LogCat 情報を確認できます...私の問題に関する詳細な質問
EDIT 2 3.配列をnullに割り当てます
それはどのように役立ちますか?null 配列はガベージ コレクションにスケジュールされますが、メソッドはスレッドから継続的に (20 ミリ秒ごとに) 呼び出されるため、これは避けたいと考えています。配列を null に割り当てると、GC_FOR_MALLOC メッセージで LogCat がいっぱいになります...