2

我有以下无限循环来监听传入的消息:

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;

    }

这个简单的过程会在几个小时内慢慢泄漏内存,我收到内存不足异常。

这个逻辑有什么问题吗?

4

2 回答 2

1

问题是我打开了一个数据库连接。我想让它保持打开状态以传递数据,而不必担心停止和启动连接。我现在每次都打开和关闭连接,一切都很好。

于 2013-07-17T00:02:46.400 回答
-1

最好的办法是将所有可能的对象实例移到循环之外。例如,在第一个代码片段中,每次迭代都会创建一个

MessageCreator tmc.

在您的第二个片段中,每次调用该方法都会创建一个

StringBuffer inputLine.

这个实例化过程可能会慢慢吞噬你的记忆。

于 2013-06-25T18:05:11.177 回答