Память увеличивается с Java UDP Server - PullRequest
0 голосов
/ 08 июня 2010

У меня есть простой UDP-сервер, который создает новый поток для обработки входящих данных. При тестировании, отправляя около 100 пакетов в секунду, я замечаю, что его использование памяти продолжает расти Есть ли какие-либо утечки из моего кода ниже?

Вот код для сервера.

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");
    }

}

Ответы [ 3 ]

5 голосов
/ 08 июня 2010

Конечно, вы выделяете (как минимум) 1412 байт новой памяти в каждом цикле.Вы увидите увеличение использования памяти, пока GC не включит и не очистит все неиспользуемые выделенные данные.

Используйте профилировщик памяти, такой как Java VisualVM , для визуализации и анализа поведения.

1 голос
/ 09 июня 2010

Вы выделяете новый поток для каждого отдельного пакета. Распределение потоков не дешево. Вы можете попытаться использовать пул потоков и просто передать пакеты рабочим потокам, взятым из пула (посмотрите java.util.concurrent, чтобы найти некоторые отличные классы, которые могут помочь).

0 голосов
/ 08 июня 2010

Почему у вас в коде бесконечный цикл while.Вы не можете запустить его в отдельном потоке.Также эта строка byte [] data = new byte [1412];выделит несколько байтов, которые не будут освобождены, пока не будет продолжен цикл infinte.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...