утечка памяти в цикле Java - PullRequest
0 голосов
/ 27 июля 2011

Я использовал цикл while для получения сообщения из Amazon SQS.Неполный код выглядит следующим образом:

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
while (true) {
    List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();

     if (messages.size() > 0) {

             MemcachedClient c = new MemcachedClient(new BinaryConnectionFactory(), AddrUtil.getAddresses(memAddress));

             for (Message message : messages) {

                 // get message from aws sqs
                 String messageid = message.getBody();
                 String messageRecieptHandle = message.getReceiptHandle();
                 sqs.deleteMessage(new DeleteMessageRequest(myQueueUrl, messageRecieptHandle));

                 // get details info from memcache 
                 String result = null;
                 String key = null;
                 key = "message-"+messageid;
                 result = c.get(key);

             }
             c.shutdown();
          }
       }

Не приведет ли это к утечке памяти в таком случае?Я проверил, используя «PS Aux».Я обнаружил, что RSS (размер резидентного набора, физическая память без перестановки, используемая задачей) медленно растет.

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Вы не можете оценить, имеет ли утечка памяти ваше приложение Java, просто основываясь на RSS процесса. Большинство JVM довольно жадные, они скорее заберут больше памяти у ОС, чем потратят много времени на сборку мусора.

Тем не менее, ваш цикл while, похоже, не имеет каких-либо очевидных «утечек» памяти, но это зависит от того, что делают некоторые вызовы метода (что не включено выше). Если вы храните вещи в статических переменных, это может вызывать беспокойство, но если единственные ссылки находятся в пределах цикла, то вы, вероятно, в порядке.

Самый простой способ узнать, есть ли у вас утечка памяти в определенной области кода, - это неукоснительно выполнять этот код за один запуск приложения (возможно, с относительно низким максимальным размером кучи). Если вы получили ошибку OutOfMemoryError, возможно, у вас утечка памяти.

1 голос
/ 27 июля 2011

Извините, но я не вижу здесь кода для удаления сообщения из очереди сообщений. Вы очистили список сообщений? В случае, если DeleteRequest удаляет сообщение из очереди, вы пытаетесь изменить список сообщений, который вы повторяете.

Также вы можете получить лучшую статистику использования памяти с помощью инструмента visualvm, который теперь является частью JDK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...