2011-07-27 4 views
0

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 (상주 세트 크기, 작업이 사용하는 비 교체 물리 메모리)가 천천히 증가한다는 것입니다.

+0

루프에서 변수를 정의하고 있습니다. 루프 위로 정의를 이동하고 루프에서 재사용/재 할당하십시오. –

+0

그냥 오버 헤드가 증가합니다. 동일한 포인터를 사용하고 있습니다. –

+1

@ D.N : 중요한 차이를 만들어서는 안됩니다. 컴파일러는 스택에 필요한 지역을 한 번만 할당 할만큼 똑똑합니다. –

답변

1

죄송합니다. 메시지 대기열에서 메시지를 제거하는 코드는 여기에 표시되지 않습니다. 메시지 목록을 정리 했습니까? DeleteRequest가 대기열에서 메시지를 제거한 경우 해당 메시지 목록을 수정하려고 시도합니다.

또한 JDK의 일부인 visualvm 도구를 사용하면 더 나은 메모리 사용 통계를 얻을 수 있습니다.

+0

반복 할 때마다 개체에 대한 참조를 제거해야합니다. 목록 크기가 문제를 야기해서는 안됩니다. –

+0

목록 메시지를 정리하지 않습니다. 목록에서 메시지를받은 다음 SQS에서 메시지를 삭제합니다. 하지만 List 메시지는 건드리지 않습니다. 다음번 반복에서 List 메시지는 SQS로부터 새로운 메시지 목록을 얻습니다. 이게 문제가 되나요? – chnet

+0

@chnet : SQS가 문제를 일으키는 지 궁금합니다. 메시지는 SQS로부터받은 객체를 가리키는 또 다른 참조가되어야한다. 괜찮을 것입니다. –

2

Java 애플리케이션에 프로세스의 RSS를 기반으로 메모리 누수가 있는지 여부는 평가할 수 없습니다. 대부분의 JVM은 꽤 욕심이 많으며 가비지 콜렉션에 많은 작업을 사용하는 것보다 OS에서 더 많은 메모리를 사용합니다.

당신의 while 루프는 명백한 메모리 "누수"가있는 것처럼 보이지 않지만 일부 호출은 어떻게되는지 (위에서 포함되지 않은)에 달려 있다고합니다. 정적 변수에 물건을 저장하는 경우, 이것은 우려의 원인이 될 수 있지만, 유일한 참조가 루프의 범위 내에 있다면 아마 괜찮을 것입니다.

특정 코드 영역에서 메모리 누수가 있는지를 확인하는 가장 간단한 방법은 응용 프로그램의 단일 실행 내에서 해당 코드를 엄격하게 실행하는 것입니다 (잠재적으로 상대적으로 낮은 최대 힙 크기로 설정). OutOfMemoryError가 발생하면 메모리 누수가 발생했을 수 있습니다.