TCP 客户端套接字填满堆
TCP client socket filling up heap
使用 java 套接字库,我看到当服务器接受 tcp 连接但不从缓冲区读取数据时,同时我们的客户端不断抽取大量数据,客户端堆大小增长到最大可用并压碎客户端应用程序。
无论如何我可以限制套接字缓冲区大小或使用该堆的任何内容,如果违反它,连接将被终止?这样客户端可以检测到客户端检测到连接已经消失
客户端;
this.socket = new Socket(server, port);
this.socket.setKeepAlive(true);
this.outwriter = new OutputStreamWriter(this.socket.getOutputStream());
this.outwriter.write(o.toString());
服务器端;
conn = serverSocket.accept();
您可以使用 socket.setSendBufferSize()。
虽然这有助于测试您的理论,但正如@EJP 所提到的,堆泄漏不会是由于发送缓冲区被填满造成的。在这种情况下,写入操作将 return 错误。
这不是套接字引起的。您的应用程序中的其他地方存在内存泄漏。您描述的行为最终将阻塞在 write()
方法中,并且不会消耗任何堆内存。
使用 java 套接字库,我看到当服务器接受 tcp 连接但不从缓冲区读取数据时,同时我们的客户端不断抽取大量数据,客户端堆大小增长到最大可用并压碎客户端应用程序。 无论如何我可以限制套接字缓冲区大小或使用该堆的任何内容,如果违反它,连接将被终止?这样客户端可以检测到客户端检测到连接已经消失
客户端;
this.socket = new Socket(server, port);
this.socket.setKeepAlive(true);
this.outwriter = new OutputStreamWriter(this.socket.getOutputStream());
this.outwriter.write(o.toString());
服务器端;
conn = serverSocket.accept();
您可以使用 socket.setSendBufferSize()。
虽然这有助于测试您的理论,但正如@EJP 所提到的,堆泄漏不会是由于发送缓冲区被填满造成的。在这种情况下,写入操作将 return 错误。
这不是套接字引起的。您的应用程序中的其他地方存在内存泄漏。您描述的行为最终将阻塞在 write()
方法中,并且不会消耗任何堆内存。