代码之家  ›  专栏  ›  技术社区  ›  Trevor

用Java UDP服务器增加内存

  •  0
  • Trevor  · 技术社区  · 15 年前

    我有一个简单的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 回复  |  直到 15 年前
        1
  •  5
  •   Mavrik    15 年前

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

    像这样使用内存分析器 Java VisualVM 观察和分析行为。

        2
  •  1
  •   dty    15 年前

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

        3
  •  -1
  •   prashant    15 年前

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