2012-04-19 2 views
0

패킷을받는 동안 가비지 수집으로 인한 작은 지연을 개선하여 성능을 향상시키고 싶습니다. 그래서 같은 데이터를 수신하는 간단한 DatagramSocket이 있습니다안드로이드 - 데이터 그램 소켓 가비지 컬렉션 향상

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) { } 
} 

위의 코드는 (내 로그 캣 뷰어에서 볼 수 있듯이) 쓰레기를 수집하는 전화를 많이되는이 끝나는 것을 제외하고 잘 작동합니다. 가비지 컬렉션을 피하기 위해 메모리를 할당하지 않으려 고하지만 위의 코드를 사용하여 동일한 결과를 얻는 좋은 방법은 누구나 볼 수 있습니까?

나는 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

이 줄을 주석 처리하면 도움이되지 않습니까? pack.setData (buff, 0, buff.length()); .. 나는 버퍼가 매번 재 작성되어 그 필요성이 없다는 것을 의미한다. – jellyfication

+0

나는 DatagramSocket.receive (DatagramPacket p)가 일부 할당 인 것으로 보인다. http : // /www.java2s.com/Open-Source/Android/android-core/platform-libcore/java/net/DatagramSocket.java.htm – jellyfication

관련 문제