调用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有自己的线程并分析您的应用程序,但我认为您可以尝试将实例化重新安排为测试和代码组织。不过,我确实认为最好的办法是进行剖析,因为目前似乎没有其他可接受的答案。