Java UDP Server 增加内存

发布于 2024-09-05 08:20:45 字数 1198 浏览 2 评论 0原文

我有一个简单的 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");
    }

}

I have a simple UDP server that creates a new thread for processing incoming data. While testing it by sending about 100 packets/second I notice that it's memory usage continues to increase. Is there any leak evident from my code below?

Here is the code for the server.

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

}

Here is the code for the new thread that processes the data. For now, the run() method doesn't do anything.

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

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

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

独自←快乐 2024-09-12 08:20:45

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

使用诸如 Java VisualVM 之类的内存分析器来可视化和分析行为。

Of couse, you're allocating (at least) 1412 bytes of new memory each loop. You'll see an increase of memory usage until GC kicks in and cleans all unused allocated data.

Use a memory profiler like Java VisualVM to visualize and analyse the behaviour.

寄与心 2024-09-12 08:20:45

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

You're allocating a new thread for every single packet. Thread allocation is not cheap. You could try to use a thread pool and just hand the packets off to worker threads taken from the pool (look at java.util.concurrent for some great classes to help here).

缺⑴份安定 2024-09-12 08:20:45

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

Why do you have a infinite while loop in your code. Can't you run it in a separate thread.
Also, this line byte[] data = new byte[1412]; will allocate some bytes which will not be released till the infinte loop is going on.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文