我有以下无限循环来监听传入的消息:
public static void listenForMessages(){
while (true) {
dsocket.receive(receivepacket);
byte[] rcvMsg = receivepacket.getData();
MessageCreator tmc = new MessageCreator();
TrafficMessage message = tmc.constructMessageFromBinary(rcvMsg);
System.out.println("message: "+message);
}
}
这会调用一个方法,该方法将字节数组读入字符串并填充消息对象。
public Message constructMessageFromBinary(byte[] rcvMsg)
throws IOException {
ByteArrayInputStream bais = new ByteArrayInputStream(rcvMsg);
DataInputStream dis = new DataInputStream(bais);
StringBuffer inputLine = new StringBuffer();
String tmp;
while ((tmp = dis.readLine()) != null) {
inputLine.append(tmp);
}
dis.close();
Message message = new Message();
message.setDescriptions(tmp);
return message;
}
这个简单的过程会在几个小时内慢慢泄漏内存,并且会收到内存不足的异常。
这个逻辑有什么问题吗?
答案 0 :(得分:1)
问题是我打开了数据库连接。我想让它打开以传递数据而不必担心停止和启动连接。我现在每次打开和关闭连接,一切都很好。
答案 1 :(得分:-1)
这里最好的选择是将所有可能的对象实例移动到循环之外。例如,在第一个代码段中,每次迭代都会创建一个
MessageCreator tmc.
在您的第二个代码段中,每次调用该方法都会创建一个
StringBuffer inputLine.
这个实例化过程可能会慢慢吞噬你的记忆。