5

各フレームの MAC アドレスを抽出してフォーマットしながら、毎秒数千のパケットを処理する必要がある Android アプリに取り組んでいます。問題は、ガベージ コレクターが 1 秒間に何十回も実行されており、アプリが停止しているため、パケットが失われることです。新しいオブジェクトを作成することは可能な限り (私が思うに) 避けています。

DDMS で割り当てトラッカーを使用したところ、クリーンアップされるガベージの 99% が次の方法によるものであることがわかりました。私が使用しているコードは次のとおりです。

void parseMac() { 
    hex_sb.setLength(0);

    for (hex_counter = 0; hex_counter < 6; hex_counter++) {
        hex_sb.append(String.format("%02X", parser_packet_bytes[parser_skip + hex_counter])); 
        if (!(hex_counter == 5)) {
            hex_sb.append(":");
        }
    }

    formatted_mac = hex_sb.toString();
}

hex_sb は、再利用される StringBuilder です。hex_counter は、MAC アドレスのバイト数です (バイトは parser_packet_bytes、byte[] から取得されます)。MAC の最後のバイトでない場合は、適切な形式にするために「:」を追加します。Formatted_mac は、フォーマットされた MAC を格納するクラス全体の文字列です。割り当てトラッカーによると、唯一の問題は String.format を使用する行です。

StackOverflow の専門家への私の質問は、次のとおりです。上記のメソッドを書き直して、ガベージが作成されないようにする方法を教えてください。

4

2 に答える 2