2012-09-30 2 views
5

레일스에서 ​​메모리 누수 문제를 해결하려고 노력 중입니다. New Relic을 통해 메모리 사용량이 계속 감소하지 않고 증가하고 있음을 알 수 있습니다.레일에서 메모리 누출의 주요 요인

이것은 문제를 해결하는 데 큰 문제가되는 큰 스레드 (Memory constantly increasing in Rails app)의 문제 중 하나입니다. 지금 내가 알아야 할 것은 단지 다음과 같습니다 :

레일스에서 ​​메모리 누수가 발생하는 주요 이유는 무엇입니까?

지금까지 내가 이해 : (예 : @@ 변수로)

  • 전역 변수를 - 내가 가지고있는이

  • 기호의 없음 (내가 어떤 특별히 제작하지 않은 경우)

  • 세션 - 여기에서 피해야 할 항목은 무엇입니까? 특정 사용자가 사이트를 텍스트 검색 할 때 사용한 마지막 쿼리를 추적하는 세션이 있다고 가정 해 봅시다. 내가 어떻게 그것을 없애야합니까?

  • "참고 자료 남기기"- 이것은 실제로 무엇을 의미합니까? 예를 들어 주시겠습니까?

  • 다른 나쁜 코딩 예제를 사용하면 일반적으로 메모리 누수가 발생합니다.

이 정보를 사용하여 코드를 살펴보고 싶으므로 예제를 제공해주십시오!

마지막으로 "메모리 누수 코드"입니까?

ProductController 
... 
@last_products << Product.order("ASC").limit(5) 
end 

@last_products가 부 풀리나요?

답변

5

다음은 응용 프로그램을 파괴합니다.

Foo.each do |bar| 
    #Whatever 
end 

많은 푸들을 가지고 있으면 메모리가 모두 필요합니다. 애플 리케이션 "Foos"의 무리가 있기 때문에 애플 리케이션을 날아 보았습니다 그리고 그들은 모든 foos를 통해 실행되는 레이크 작업을 가지고 있으며,이 레이크 작업은 영원히 걸립니다 말 Y 초X 초, 여기서 x <y. 그래서 그들은 이제 모든 Foos를 메모리에 두 번 이상 가지고 있습니다. 왜냐하면 그들은 단지 메모리에 물건을 계속해서 가져 오기 때문입니다.

똑같은 방식으로 앞면 웹 앱 내부에서 정확히 일어날 수는 없지만, 정확하게는 효율적이거나 원하지 않습니다. 대신 위의

은 사물과 배치를 검색하고 한 번에 메모리에 물건을 왕창 넣어하지 않습니다 다음

Foo.find_each do |bar| 
    #Whatever 
end 

을한다.

바로이 질문을 입력하면 지난해 9 월에이 질문을 받았다는 것을 깨달았습니다 ... 오 소년 ...