我使用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(驻留集大小,任务使用的非交换物理内存)增长缓慢。
答案 0 :(得分:2)
您无法仅根据流程的RSS评估Java应用程序是否存在内存泄漏。大多数JVM非常贪婪,他们宁愿从操作系统中获取更多内存,也不愿在垃圾收集上花费大量工作。
那说你的while循环似乎没有任何明显的内存“泄漏”,但这取决于一些方法调用的作用(上面没有包含)。如果要将事物存储在静态变量中,这可能会引起关注,但如果唯一的引用属于循环范围,则可能没问题。
了解代码区域内是否存在内存泄漏的最简单方法是在应用程序的单次运行中严格执行该代码(可能使用相对较低的最大堆大小设置)。如果出现OutOfMemoryError,则可能是内存泄漏。
答案 1 :(得分:1)
抱歉,我在这里看不到从邮件队列中删除邮件的代码。你清理了消息列表了吗?如果DeleteRequest从队列中删除了消息,那么您尝试修改迭代的消息列表。
此外,您可以使用visualvm工具获得更好的内存使用统计信息,该工具现在是JDK的一部分。