gpt4 book ai didi

java - ObjectInputStream 消耗过多内存

转载 作者:行者123 更新时间:2023-11-30 07:41:54 24 4
gpt4 key购买 nike

我有一个套接字,它每隔几秒通过 ObjectOutputStream 向客户端发送一个对象列表。在服务器端,每次 writeObject(myList) 之后,我执行 flush 然后 reset。使用VisualVM检查内存使用情况,在服务器上没有内存泄漏,但在客户端上似乎之前读取的List都保留在内存中。我尝试在客户端的 ObjectInputStream 上执行 reset 但看起来 ObjectInputStream 不支持此方法(它会抛出 java.io.IOException: mark/reset not support )。

这是我的服务器套接字:

public class ConsultaBombas {

public static void inicializarServidorSocket() {
try {
ServerSocket serverSocket = new ServerSocket(5963);
Thread thread = new Thread(() -> {
while (!serverSocket.isClosed()) {
try {
final Socket socket = serverSocket.accept();
new ThreadComunicacao(socket).start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.setName("Consulta bombas (Inicializador)");
thread.start();
} catch (Exception e) {
e.printStackTrace();
}
}

static class ThreadComunicacao extends Thread {
private Socket socket;

public ThreadComunicacao(Socket socket) {
this.socket = socket;
setName("Consulta bombas (Comunicação) com início: " + new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
}

@Override
public void run() {
try {
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
while (!socket.isClosed()) {
List<Bomba> bombas = new DaoBomba().findAll();
out.writeObject(bombas);
out.flush();
out.reset();
Thread.sleep(1000);
}
} catch (SocketException e) {
if (e.getLocalizedMessage() != null && e.getLocalizedMessage().equalsIgnoreCase("Connection reset by peer: socket write error")) {
System.out.println("Cliente desconectou...");
} else {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

}

这是客户端(使用 start() 方法启动):

public class ConsultaBombasClient {

private Socket socket;
private Thread threadConsulta;

public ConsultaBombasClient(BombasListener bombasListener, String maquinaDestino) {
threadConsulta = new Thread(() -> {
try {
Thread.currentThread().setName("Consulta Bombas");
System.out.println("Endereço bagual: "+maquinaDestino);
socket = new Socket(maquinaDestino, 5963);
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Object leitura;
while ((leitura = in.readObject()) != null) {
List<Bomba> bombas = (List<Bomba>) leitura;
bombasListener.run(bombas);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
});
threadConsulta.setDaemon(true);
}

public void start() {
threadConsulta.start();
}

public interface BombasListener {
void run(List<Bomba> bombas);
}

}

我做错了什么?

最佳答案

垃圾收集不是即时的,你有什么真正的内存问题吗?您是否尝试过以低 -Xmx 值运行客户端,是否收到 OutOfMemoryError ? – user3707125

你是对的,一段时间后,当内存接近最大堆大小时,它会从内存中清除对象。我没有看到这一点,因为我的电脑中有很多 RAM,但使用 Xmx50m,我可以看到它按照你所说的方式工作。 ——马特乌斯·维卡里

关于java - ObjectInputStream 消耗过多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com