Java UDP Server会增加内存

时间:2010-06-08 19:15:11

标签: java multithreading udp

我有一个简单的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 个答案:

答案 0 :(得分:5)

当然,你在每个循环中分配(至少)1412个字节的新内存。在GC启动并清除所有未使用的已分配数据之前,您会看到内存使用量的增加。

使用像Java VisualVM这样的内存分析器来可视化和分析行为。

答案 1 :(得分:1)

您正在为每个数据包分配一个新线程。线程分配并不便宜。您可以尝试使用线程池,只需将数据包传递给从池中获取的工作线程(请查看java.util.concurrent以获取一些很好的类来帮助)。

答案 2 :(得分:-1)

为什么代码中有无限的while循环。你不能在一个单独的线程中运行它。 此外,此行byte [] data = new byte [1412];将分配一些字节,这些字节在infinte循环进行之前不会被释放。