2010-08-04 4 views
0

현재 히트 율이 높을 때 간헐적 인 문제를 일으킨 웹 응용 프로그램을 현재 디버깅 중입니다. 각각의 새로운 사용자에게 개인화 된 탐색 메뉴가 포함 된 세션이 주어질 때마다 나는 세션 변수가 얼마나 많은 메모리를 필요로하는지 알아 내려고 노력할 것이라고 생각했습니다. 나를 놀라게 무엇JSP에서 데이터 손실을 일으키는 System.gc() 호출

System.gc(); 
long orgHeap = Runtime.getRuntime().freeMemory(); 

... create session variables ... 

System.gc(); 
log.info("Heap delta: " + (Runtime.getRuntime().freeMemory() - orgHeap)); 

가) (이루어지는 시스템을 추가하는 응용 프로그램을 나누기 때문이다 : 세션 객체의 생성을 처리하는 JSP의 코드 섹션에서

, 나는 다음과 같은 코드를 추가했다. 어떤 객체가 없어지면 더 이상 작동하지 않습니다 (또는 그렇게 보입니다). 초기화 된 값은 null입니다. gc() 호출이 제거되면 앱이 정상적으로 작동합니다. gc()는 삭제 표시가 된 객체 만 제거해야합니다 - 맞습니까?

비슷한 문제가있는 사람이 있습니까?

+0

전혀 그런 문제가 없었습니다. 어딘가에 다른 문제가있을 수 있습니다. – stacker

+0

매우 드뭅니다 ... 다른 일이 진행되고 있습니다. – skaffman

+0

매번 새로운 세션을 만들 수 있습니까? – naikus

답변

0

가비지 수집은 실제 개체를 제거하지 않으므로 문제가 다른 곳에서 발생한다고 생각합니다.

"적중률이 높습니다"라고 말하면서, 이것은 EJB를 잘못 사용했을 때 발생할 수 있습니다. 낮은 부하에서 발생하기 때문에 (예 : 그것을 요구한다.)하지만 부하가 높을 때 (EJB를 얻은 다른 사람은 다른 것을 얻는다.)

2

설명 할 때 실제로 발생할 수있는 경우를 생각할 수있는 유일한 경우는 WeakReference (또는이 상황에서 광범위하게 유사한 SoftReference) 만 사용하면 여전히 원하는 개체를 참조하는 것입니다. 유지. 물체가 수집 할 수있는 상태로 들어갈 수있는 물체는 입니다. 실제로 실행될 때까지는 참조를 통해 연락 할 수 있습니다. System.gc()을 호출하면 보장 된 의미 체계가 없어도 콜렉터가 실행되어 이러한 모든 약한 도달 가능 오브젝트를 수집 할 수 있습니다. 하지만, 아닌 것 같습니다

, 강력한 도달 개체에 대한

  1. 실수로 사용하여있는 WeakReferences가에 해당하는 쉬운 실수처럼 보이지 않기 때문입니다. 라이브러리를 사용하는 경우에도 실수로 약한 참조를 사용하게 될 가능성이있는 경우를 생각하기가 어렵습니다.
  2. 이 경우 응용 프로그램의 동작이 어쨌든 정의되지 않습니다. 가비지 콜렉션은 언제든지 발생할 수 있으므로 System.gc() 호출없이 일관성없는 동작을 보일 수 있습니다. 어쨌든 콜렉션 직후에 실행되는 코드가 있기 때문에 해당 객체를 찾을 수 없습니다.
  3. System.gc()는 이론적으로 아무 것도하지 않으므로이 문제를 일으키지 않아야합니다.

마지막 점은 중요 하나입니다 - 왜이 이루어지는 시스템을 요구하고있다() 어쨌든, 그것은 거의 항상 역효과를 할 때 전화를? 나는 당신이 합법적으로 그것을 부를 필요가 있다고 믿지 않으며, 당신이 의지 할 수있는 어떤 것도하지 않으며, 분명히 당신의 신청을 어긴 것입니다.

전화를 걸지 않아도 앱이 정상적으로 작동하면 앱 만들기를 중단하십시오.

나는 실제 문제의 원인이 될 수 없기 때문에 당신의 앱이 어떻게 어울리는 지 조사 할 것을 고려할 것입니다. 그리고 당신은 나중에 아주 깨지기 쉽고 잠시 후 깨울 수있는 더 깊은 문제가있을 수 있습니다.

편집 : 다른 가능한 이유는 간단한 타이밍 일 수 있습니다. System.gc()으로 전화하면 무시할 수 없을 정도의 시간이 걸릴 것입니다. 이 기간 동안 다른 스레드는 GCing 스레드가 예상하지 않는 방식으로 진행하고 상태를 변경할 수 있습니다. 그러므로 호출로부터 복귀 할 때, 세계의 상태는 기대를 깨뜨리고 따라서 논리 오류가 발생합니다. 다시 말하지만, 이것은 단지 추측이지만 WeakReference보다 더 그럴듯합니다.

+0

의견을 보내 주셔서 감사합니다. WeakReference의 삭제와 같은 것이 가능한지 궁금 해서요. 그러나 그것이있을 법하지 않다고 동의합니다. gc()를 추가하는 이유는 세션 객체가 사용하는 메모리의 양을 확인하기 위해서입니다. 새로운 객체를 만들기 전에 힙을 정리하고 싶었습니다. 또한 각 세션 생성은 단일 스레드에서 실행됩니다. – paul

관련 문제