whileループを使用してAmazon SQSからメッセージを取得しました。部分コードは次のとおりです。java whileループメモリリーク
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(常駐セットサイズ、タスクが使用したスワップされていない物理メモリ)がゆっくりと成長していることです。
ループ内の変数を定義しています。定義をループの上に移動し、ループ内で再利用/再割り当てします。 –
それは単にオーバーヘッドを増やす、彼らは同じポインタを使用していますか? –
@ D.N:重要な違いはありません。コンパイラは、必要なローカルをスタックに1回だけ割り当てることができるほどスマートです。 –