2010-03-15 2 views
4

나는 우리의 고객 중 하나가, 가지고있는 Jboss4에 java.lang.OutOfMemoryException을 재현하기 위해 노력하고 원인하려고합니다. 는 아마도 일/주 동안 J2EE 애플리케이션을 실행하여 java.lang.OutOfMemoryException

내가 (대신 일/주) 웹 애플리케이션은 몇 분 만에 java.lang.OutOfMemoryException을 spitout 수있는 방법을 찾기 위해 노력하고있다. 마음에 와서

한 가지 셀레늄 스크립트를 작성하고 스크립트는 웹 어플리케이션을 포격있다. 우리가 할 수있는 또 하나의 일은 JVM 힙 크기를 줄이는 것이지만 우리는 시스템의 한계를보고 싶기 때문에 이것을하지 않는 것이 좋습니다.

제안 사항?

PS : 나는 우리가

+3

"ps : 소스 코드에 액세스 할 수 없습니다." - 자신의 제품 중? 제이 보스? –

+1

@Stephen C : 그는 웹 앱이 그의 제품이라고 말하지 않았고, 단지 그것을 사용하는 사람이 그의 고객이라고 말했다. 그는 예를 들어 호스팅 제공 업체가 될 수 있습니다. –

+1

"우리가 할 수있는 것은 JVM 힙 크기를 줄이는 것이지만 시스템의 한계를보고 싶기 때문에 이것을하지 않는 것이 좋습니다." 클라이언트 시스템과 같은 정확한 참조 테스트 시스템을 가지고 있다면 이것을하지 않는 것이 유용합니다.따라서 2Gb 힙에서 오류가 발생하는지 파악할 수 있습니다. 오류를 더 빨리 복제하려는 경우 작은 힙에서 Selenium 또는 JMeter 스크립트를 누르지 만 적절한 크기 즉 모든 영 : 이전 등의 비율로 설정된 모든 JVM 매개 변수를 사용하면 – JoseK

답변

0

모두를 수행합니다 (... 물론 나는 클래스 파일을 디 컴파일 수) 호스팅 서비스를 제공하기 때문에, 소스 코드에 액세스 할 수 있지만하지 않는 제어 방식 :

  1. 은 (예를 들어, -Xms1M -Xmx2M를 사용하지만 앱도 같은 제한 사항로드되지 않습니다 두려워) 절대 최소로 사용 가능한 메모리를 줄
  2. 제어 마십시오 "핵 조사를"셀레늄 스크립트를 수행하거나 각각의 알려진 URL은 유죄가 입증 된 것으로 추정됩니다.
  3. 마지막으로 제기 할 수 없다 힘을 발휘 : VisualVM과를 시작하고 당신이 생각할 수있는 다른 모니터링 소프트웨어 (DB 실행은 평소 용의자). 문제의 J2EE 응용 프로그램의 소스 코드에 액세스 할 수없는 경우
1

는 떠오르는 옵션은 다음과 같습니다

  1. 는 JVM에 사용 가능한 RAM의 양을 줄일 수 있습니다. 당신은 이미 이것을 확인하고 그것을하고 싶지 않다고 말했습니다.

  2. J2EE 응용 프로그램 (아마도 JSP 일 수 있음)을 만들어 대상 응용 프로그램과 동일한 JVM 내에서 실행되도록 구성하고 그 응용 프로그램이 엄청난 양의 메모리를 할당하도록하십시오. 그렇게하면 대상 응용 프로그램에서 사용할 수있는 메모리 양이 줄어들어 사용자가 강제로 시도하는 방식으로 실패 할 수 있습니다.

+0

hm 포인트 2를 시도합니다. 또 다른 J2EE 애플리케이션 – portoalet

+0

@ TJ를 만들면 옵션 2가 클라이언트 측에서 발생하는 것과 동일한 OOM을 발생시킬 것입니까? OOM을 발생시키기 위해 힙 크기를 줄임으로써 앱을 질식시킬 가능성이 큽니다. 클라이언트가 경험하고있는 것처럼 메모리 누수의 근본 원인 일 필요는 없습니다. – JoseK

+0

@josek : 그의 예외는 클라이언트 측이 아니라 서버 측에서 발생합니다. 제안 # 2의 목표는 많은 메모리를 사용하여 대상 앱이 일부를 얻으 려 할 때 몇 주 후에 사용하는 예외를 throw하도록하는 것입니다. 나는 그들이 진단 목적으로 의도적으로 일어날 수 있기를 원한다고 생각한다. –

0

문제의 근원은 클라이언트가 실행중인 webapp에서 메모리 누출 가능성이 가장 높습니다. 추적하려면 메모리 프로파일 링이 활성화 된 대표 작업 부하로 앱을 실행해야합니다. 일부 스냅 샷을 찍은 다음 프로파일 러를 사용하여 스냅 샷을 비교하여 객체 누출 위치를 확인하십시오. 소스 코드가 이상적 일 수 있지만 누출 된 개체가 할당되는 위치를 적어도 파악할 수 있어야합니다. 그런 다음 원인을 추적해야합니다.

그러나 고객이 실행중인 시스템과 동일한 시스템을 실행할 수 있도록 바이너리를 릴리스하지 않으면 문제가 발생하고 프로파일 링 및 누출 감지를 수행해야합니다. 그 자신.

은 BTW - OutOfMemoryError가 던져 웹 애플리케이션을 일으키는 지점이 많이 없다. 그것은 왜 일어나고 있는지, 그리고 "왜"당신이 그것에 대해 많은 것을 할 수 없는지를 이해하지 못하면서 당신에게 말하지 않을 것입니다.

편집

가 가리 키지는 "한계를 측정", 메모리 누수의 근본 원인은 클라이언트의 코드에있는 경우. 서블릿 호스팅 서비스를 제공한다고 가정 할 때 가장 좋은 방법은 클라이언트에게 메모리 누수를 디버그하는 방법에 대한 지침을 제공하는 것입니다. 또한 코드를 디버그해야하는 지원 계약이있는 경우 작업을 수행 할 소스 코드를 제공해야합니다.

+0

아니요 우리는 호스팅 제공 업체처럼 운영되므로 소스 코드에 액세스 할 수 없습니다 (물론 클래스 파일을 디 컴파일 할 수 있습니다). – portoalet

+0

@portoalet - 내가 말했듯이 소스 코드 액세스가 필요하지 않습니다. 바이너리/configs/etc에 액세스하면 클라이언트의 webapp를 재현 할 수 있습니다. –

0

Sun Java 6을 사용하는 경우 JDK에서 jvisualvm을 사용하여 응용 프로그램에 연결하는 것이 좋습니다. 이렇게하면 시나리오에서 아무 것도 변경하지 않고도 현재 위치 프로파일 링을 수행 할 수있게되어 범인을 즉시 공개 할 수 있습니다.

+0

슬프게도 jre1.4.04에서 실행 중입니다. – portoalet

1

일부 프로파일 링 도구를 사용하여 메모리 누수를 조사하십시오. 또한 OOM이 발생한 후 기록 된 메모리 습기를 조사하는 것이 좋습니다. IMHO : 기억을 줄이는 것이 실제 생산 방식과 관련없는 문제를 얻을 수있는 방법을 조사하는 가장 좋은 방법은 아닙니다.

0

소스를 디 컴파일하지 않으면, 적어도 사용 조건에서 허용하고 자유 국가에 거주한다고 생각되는 경우입니다. 다음을 사용할 수 있습니다 : Java Decompiler 또는 JAD.

0

다른 모든 것들 외에도 OutOfMemory 오류를 재현하여 어디서 발생했는지 알 수있을지라도 알만한 가치가있는 것을 발견하지 못했을 것입니다.

문제는 할당을 수행 할 수 없을 때 OOM이 발생한다는 것입니다. 그러나 실제 문제는 그 할당이 아니라 코드의 다른 부분에서 다른 할당이 할당 해제 (참조 해제 및 가비지 수집)되지 않았다는 사실입니다. 실패한 할당은 문제의 원인과 아무런 관련이 없습니다.

이 문제는 문제가 발생하기 몇 주일이 걸릴 수 있으므로 드문 드문 사용되는 응용 프로그램이나 비정상적인 코드 경로 또는 코드가 불필요한 코드와 관련하여 상대적으로 많은 양의 메모리를 제안하므로이 문제는 더 큰 것입니다. 괜찮 았어.

왜이 양의 메모리가 JBoss 용으로 구성되었고 다른 것이 아닌지 묻는 것이 좋습니다. 공급 업체가 누출량에 대해 이미 알고 있고 버그의 영향을 완화하도록 요구 한 것보다 공급 업체에서 권장하는 경우.

이러한 종류의 오류 때문에 코드 경로가 문제가 발생하여 대상 테스트를 수행 할 수있는 아이디어가 필요합니다. 프로파일 러를 사용하여 테스트를하면 런타임 중에 객체 (목록,지도 등)가 줄어들지 않고 볼 수 있습니다.

그러면 올바른 클래스를 디 컴파일하여 잘못된 것을 확인할 수 있습니다. (try 블록과 finally 블록을 닫거나 청소하는 것).

어쨌든 행운을 비네. 나는 건초 더미에서 바늘을 찾는 것을 선호한다고 생각합니다. 바늘을 발견하면 적어도 을 알고 있습니다.

관련 문제