2010-06-08 3 views
0

들어오는 데이터를 처리하기위한 새로운 스레드를 만드는 간단한 UDP 서버가 있습니다. 초당 약 100 패킷을 전송하여 테스트하는 동안 메모리 사용량이 계속 증가한다는 것을 알았습니다. 아래 코드에서 누수가 분명합니까?Java UDP 서버로 메모리가 증가합니다.

다음은 서버 코드입니다.

public class UDPServer 
{ 
    public static void main(String[] args) 
    { 
     UDPServer server = new UDPServer(15001); 
     server.start(); 
    } 

    private int port; 

    public UDPServer(int port) 
    { 
     this.port = port; 
    } 

    public void start() 
    { 
     try 
     { 
      DatagramSocket ss = new DatagramSocket(this.port); 

      while(true) 
      { 
       byte[] data = new byte[1412]; 
       DatagramPacket receivePacket = new DatagramPacket(data, data.length); 
       ss.receive(receivePacket); 
       new DataHandler(receivePacket.getData()).start(); 
      } 

     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

다음은 데이터를 처리하는 새 스레드 코드입니다. 지금은 run() 메서드가 아무 것도하지 않습니다.

public class DataHandler extends Thread 
{ 
    private byte[] data; 

    public DataHandler(byte[] data) 
    { 
     this.data = data; 
    } 

    @Override 
    public void run() 
    { 
     System.out.println("run"); 
    } 

} 

답변

5

당신은 각 루프마다 (적어도) 1412 바이트의 새로운 메모리를 할당하고 있습니다. GC가 시작될 때까지 메모리 사용량이 증가하고 사용되지 않는 모든 할당 된 데이터가 정리됩니다.

Java VisualVM과 같은 메모리 프로파일 러를 사용하여 동작을 시각화하고 분석하십시오.

+0

모든 eden, survivor 및 old-gen 힙 크기에 대한 뷰가 포함되어 있으므로이 경우 JConsole이 더 좋을 것입니다. 또한 gc를 강력하게 제안 할 수 있습니다. –

-1

왜 코드에 무한 while 루프가 있습니까? 별도의 스레드에서 실행할 수 없습니까? 또한,이 행 byte [] data = new byte [1412]; infinte 루프가 진행될 때까지 해제되지 않을 몇 바이트를 할당합니다.

+0

들어오는 패킷을 받기 위해 루프가 대기하고 데이터를 처리하기 위해 새 스레드를 만든 다음 루프를 다시 시작하여 들어오는 다른 패킷을 기다립니다. – Trevor

+0

'새로운 바이트 [1412]; 해제되지 않을 일부 바이트를 할당합니다. ' 올바르지 않습니다. 이 참조는 매번 루프 주위에서 해제됩니다. 스레드의 다른 참조는 스레드가 종료 될 때 해제됩니다. 나는 당신이 패킷 당 쓰레드를 사용하지 말아야한다는 다른 포스터에 동의한다. 처리에 따라 새로운 스레드가 전혀 필요하지 않을 수도 있습니다. 그렇지 않으면 원격 SocketAddress 당 스레드를 사용하는 것이 좋습니다. – EJP

1

모든 단일 패킷에 대해 새 스레드를 할당하고 있습니다. 스레드 할당은 저렴하지 않습니다. 쓰레드 풀을 사용하고 풀에서 가져온 작업자 스레드에 패킷을 전달할 수 있습니다 (여기에서 도움이되는 훌륭한 클래스는 java.util.concurrent를보십시오).

관련 문제