JavaMe でガベージ コレクターが動作する方法を微調整して、何らかの方法でパフォーマンスを向上させることができるかどうか疑問に思っていました (パッセージの数を減らす可能性があります)。それに関する記事をいくつか見たことがありますが、ほとんどが Java SE 向けであり、そのほとんどは GC はメーカーに大きく依存していると述べています。それはいくらでしょう。
3 に答える
アプリケーションが実行されている特定の VM がどのように実装され、使用している特定の電話用にどのように構成およびカスタマイズされているかを直接知っていない限り、ガベージ コレクターがいつトリガーされるかはほとんど謎です。
java.lang.System.gc() を呼び出しても、ガベージ コレクターがトリガーされる保証はありません。これは通常、VM がガベージ コレクションをすぐに開始する可能性を高めるだけです。
System.gc() を同じ Thread で 3 回連続して呼び出すと、3 つの異なるメソッドから呼び出すと、かなりうまく機能する傾向があることがわかりました。
生成するガベージの量を減らすために、JavaME 標準 API 実装の非効率性を回避する方法は多数あります。
ByteArrayOutputStream を拡張して、データにアクセスするときにバイト配列のコピーを作成しないようにします。
StringBuffer.getChars() および StringBuffer.toString() の呼び出しは避けてください。代わりに StringBuffer のオフセットと長さを使用してコードを動作させてください。
ローカル バッファ (byte[]、StringBuffer...) をインスタンス変数または静的変数に変換します (そして、同期化してそれらを保護します)。明らかに、これを行うにはオーバーヘッドがありますが、ガベージ コレクションが頻繁に発生するためにアプリケーションがフリーズするのを防ぐことができます。
String と StringBuffer の間の切り替えを避けるために StringBuffer を拡張します: append(String, offset, length), parseInt(int), indexOf(String, index), replace(offset, StringBuffer, offset, length)... を実装します。
...
J2ME でガベージ コレクションの動作を微調整する方法が思い浮かびません。
ガベージ コレクションによって引き起こされる一時停止に問題がある場合は、次の 2 つのことを行う必要があります。
- オブジェクトを再利用することで、プログラムが生成するガベージを減らし、文字列の連結などのコストのかかることを避けます (代わりに StringBuffer を使用してください)。
- System.gc() を使用して、少しのフリーズが問題にならない場合 (たとえば、ゲームの「ロード中」画面中) にガベージ コレクションを強制し、迷惑なときにコレクター プロセスがトリガーされる可能性を減らします。
すべての入力者に感謝します。Java Me 対応デバイスの GC を微調整することは不可能であることがわかりました。少なくとも簡単で便利な方法ではありません。とりあえず、このシナリオが何らかの形で変化する場合に備えて、この質問は開いたままにします. :)