调用datainputstream的java无限循环收到内存不足异常
我有以下无限循环用于侦听传入消息:调用datainputstream的java无限循环收到内存不足异常,java,memory-leaks,out-of-memory,infinite-loop,datainputstream,Java,Memory Leaks,Out Of Memory,Infinite Loop,Datainputstream,我有以下无限循环用于侦听传入消息: public static void listenForMessages(){ while (true) { dsocket.receive(receivepacket); byte[] rcvMsg = receivepacket.getData(); MessageCreator tmc = new MessageCreator();
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;
}
这个简单的过程在几个小时内缓慢地泄漏内存,我收到一个内存不足异常
这个逻辑有什么问题吗?这里最好的办法是将所有可能的对象实例化移到循环之外。例如,在第一个代码段中,每次迭代都会创建一个
MessageCreator tmc.
StringBuffer inputLine.
在第二个代码段中,对该方法的每次调用都会创建一个
MessageCreator tmc.
StringBuffer inputLine.
这个实例化过程可能正在慢慢消耗您的内存。问题是我没有打开数据库连接。我想让它保持开放状态以传递数据,而不必担心停止和启动连接。现在,我每次都会打开和关闭连接,一切都很好。提供帮助将帮助我们更快地解决您的问题。如果你不能给我们提供这样的例子,你可能会想自己分析一下你的应用程序。我相信JVisualVM附带了Oracle的JDK,但是还有很多,这里真的没有足够的信息。我在代码中看到的唯一两个可能泄漏内存的对象引用是{dis}和{dsocket},这取决于它们是什么以及如何处理它们。通常不能从块的局部变量泄漏内存;引用位于堆栈上,当块退出时,它们可用于垃圾收集。通常,您需要查找不在堆栈上的内容,或者在永远不会返回的方法中的内容。在循环中,每次都会替换无止境循环块中的变量,因此这不应该是泄漏。垃圾收集会回收该内存。即使它不是null并且运行在相同的调用堆栈位置?值得一试…@Jeffrey你说解决办法是什么?@Atma我不知道。你没有提供足够的信息。请看关于您的问题的两条评论。@Atma虽然Jeffrey关于这个问题缺乏信息的说法是正确的,GC有自己的线程并分析您的应用程序,但我认为您可以尝试将实例化重新安排为测试和代码组织。不过,我确实认为最好的办法是进行剖析,因为目前似乎没有其他可接受的答案。