2012-04-19 11 views
0

パケットを受信して​​いるときにガベージコレクションによって引き起こされる小さなラグを改善することで、パフォーマンスを向上させたいと考えています。上記Android - データグラムソケットガベージコレクションの改善

DatagramSocket sock; 
try { 
    sock = new DatagramSocket(port); 
    sock.setReuseAddress(true); 
} catch (SocketException e) { } 

DatagramPacket pack = null; 
byte[] buff = new byte[SIZE]; 

while(!sock.isClosed()){ 
    try{ 
     pack = new DatagramPacket(buff, buff.length()); 
     sock.receive(pack); 
    } catch (IOException e) { } 
} 

コード(私のLogCatビューアに見られるように)ごみを収集するためのコールがたくさんあることが終わることを除いてうまく機能:私はそうは以下のようにデータを受信し、単純なDatagramSocketを持っています。ガベージコレクションを避けるために、メモリを割り当てないようにしたいのですが、誰もが上記のコードでそれを行い、それでも同じ結果を得るよい方法を見ていますか?

私はthis threadthis threadを見ましたが、私の特定の状況にどのようにマッピングされるかはわかりません。私はまた、GCを呼び出すためにthis suggestionを見ましたが、この場合、GCはその間に何度も実行されています。

ご意見をいただければ幸いです!

+0

「new」を作成すると、オブジェクトが不要になったらGCが起動します。ループでは 'new'を行います=不要になったオブジェクトがたくさんあります。それを避けてオブジェクトを再利用することができれば、GCが少なくなります。 @jellyfication答えの方法を参照してください – zapl

答えて

0

これはどうですか?

DatagramSocket sock; 
try { 
    sock = new DatagramSocket(port); 
    sock.setReuseAddress(true); 
} catch (SocketException e) { } 

DatagramPacket pack = null; 
byte[] buff = new byte[SIZE]; 
pack = new DatagramPacket(buff, buff.length()); 

while(!sock.isClosed()){ 
    try{ 
     pack.setData(buff, 0, buff.length()); // Maybe you can comment this line out. If the buffer doesn't change its irrelevant 
     sock.receive(pack); 
    } catch (IOException e) { } 
} 

新しいDatagramPacketオブジェクトを構築し続ける必要がありますか?バッファのサイズが変更されないので、変更しないでください。

+0

これは良い提案でしたが、私はそれを試してみましたが、まだ重いガベージコレクションを取得しています。一時停止するとコレクションが停止し、再起動するとGCも停止します。 – user1205577

+0

この行をコメントアウトしても助けられませんか?私はバッファが毎回書き換えられてその必要がないことを意味します。 – jellyfication

+0

私はDatagramSocket.receive(DatagramPacket p)の中にいくつかの割り当てがあるようですhttp:///www.java2s.com/Open-Source/Android/android-core/platform-libcore/java/net/DatagramSocket.java.htm – jellyfication