2009-08-25 2 views
7

Websphere Application Server 6.0에서 실행되는 응용 프로그램을 가지고 있으며 Out-Of-Memory로 인해 거의 매일 충돌합니다. 자세한 정보 GC에서 메모리 누수가 있는지 확인하십시오. (대부분)메모리 부족 상태를 감지하는 방법은 무엇입니까?

불행히도 응용 프로그램은 외부 공급 업체에서 제공하며 고정되는 것은 느립니다. & 고통스러운 프로세스입니다. 이 프로세스의 일부로 OOM이 발생할 때마다 로그와 힙 덤프를 수집해야합니다.

이제 자동화하는 방법을 찾고 있습니다. 근본적인 문제는 어떻게 OOM 상태를 검출 할 수 있는가이다. 한 가지 방법은 주기적으로 새 힙 덤프를 검색하는 셸 스크립트를 만드는 것입니다. 이 접근법은 좀 더러운 것 같습니다. 다른 접근법은 JMX를 어떻게 든 활용하는 것입니다. 하지만이 분야에 대한 경험이 거의 없거나 전혀하지 못했고 그 방법을 많이 알지 못했습니다.

아니면 어떤 종류의 방아쇠/후크가 있습니까? 모든 조언을 주셔서 대단히 감사합니다!

답변

4

자동화 된 힙 덤프를 원하지만 OOM의 힙 덤프가있는 @Mark's solution이 만족스럽지 않은 경우 두 가지 옵션이 표시됩니다.

  1. 당신은 높은 메모리 압력을 감지 할 MemoryMXBean 사용할 수 있으며, 다음 사용 (또는 사용 델타) 높은 programmatically create a heap dump 보인다합니다.
    • 주기적으로 메모리 사용 정보를 가져오고 jmap (로컬 및 원격 모두에서 작동)을 사용하여 cron'd 쉘 스크립트로 힙 덤프를 생성 할 수 있습니다.

당신이 음을 OOM에 콜백을 가지고 있지만 수 있다면 좋을 텐데, 그 콜백은 아마 그냥 OOM 오류로 충돌 것입니다. :)

9

시작시 JVM에 다음 인수를 전달할 수 있으며 OutOfMemoryError에 힙 덤프가 자동으로 생성됩니다. 두 번째 인수는 힙 덤프 파일의 경로를 지정할 수있게합니다. 적어도 힙 덤프가 발생했는지 확인하기 위해 특정 파일의 존재 여부를 확인할 수 있습니다.

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=<value> 
+0

감사합니다. 나는 이것을 사용하고 있지만 heapdump가 생성되었다는 어떤 종류의 통지가 필요하다. 그리고 정기적으로 파일 시스템을 검사하는 것보다 나은 접근법을 찾고 있습니다. –

+0

특정 파일의 존재 여부 만 확인하면되므로 내 대답이 업데이트되었습니다. 나는 더 나은 접근법이 있는지 확신하지 못한다. – Mark

+2

다음과 같이 사용자에게 알립니다. -XX : OnOutOfMemoryError = "사용자에게 메일을 보내거나 사용자에게 알리려는 명령을 실행하려면"PID PID가 방금 힙 덤프를 생성했습니다 (mail [email protected]) ". – HaveAGuess

1

그리고 응용 프로그램이 스크립트에 당신이 열두 시간 동안 생존 할 수 있다는 낙관적 인 경우 매일 밤 같은 제어를 다시 시작 할 수있다 추락 할 때까지 기다리는 대안 ..

어쩌면 스피어가 있다고 할 수있다 너를 위해!?

+0

음, 단기간에 도움이 될 것입니다. 다른 손에서 누출을 고쳐야합니다. 그리고이 방법은 OOM이 발생할 때 로그를 수집하지 못하게합니다. –

+0

아, 내 외부 공급 업체가 문제를 해결할 때까지 기다려야한다고 생각했습니다. 물론, 다른 이야기보다보고를 위해 해시 덤프가 필요한 경우 :) –

1

세션/응용 프로그램 범위에 새 객체를 추가 할 때마다 호출되는 리스너 (세션 범위 또는 응용 프로그램 범위 속성 수신기) 클래스를 추가 할 수 있습니다. 이에

- 당신이 전화 실행 GC 등으로 응용 프로그램 (그 로그)에 의해 사용되는 총 메모리를 확인하기 위해 시도 할 수 있습니다 (참고 항상 실행됩니다 GC 의미하지 않습니다 호출)이 위입니다

을 (로깅 파트 및 gc 사용량 증가에 따라)

예약 된 gc : 또한 몇 시간마다 실행되고 gc에 대한 요청을 수행하는 타이머 작업 클래스를 유지할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 불행히도 메모리 누수 (개체에 대한 불필요한 참조)가있는 경우 GC를 실행하면 도움이되지 않습니다. Verbose GC 그래프에서 OOM 전에 가비지 수집기가 자주 트리거되는 것을 볼 수 있습니다. –

+0

그런 경우, 사용하지 않는 추가 활성 객체를 알고있는 경우 정의 된 기간 후에 범위 (app/session)에서 제거 할 수 있습니다. – techzen

3

JConsole을 보았습니까? JMX를 사용하여 메모리 정보를 비롯한 다양한 JVM 메트릭에 대한 가시성을 제공합니다. 메모리를 소비하는 방법 /시기에 대한 느낌을 얻기 위해이 기능을 사용하여 응용 프로그램을 모니터링하는 것이 좋습니다. 하루 동안 또는 특정 기능을 사용할 때 메모리가 일정하게 소비된다는 것을 알 수 있습니다.

위 링크의 detecting low memory 부분을 살펴보십시오.

JMX client을 작성하여 이라는 응용 프로그램을보고을 자동으로 실행하고 필요한 조치를 취하십시오. JConsole은 폴링해야하는 JMX 메소드를 나타냅니다.

0

최신 Java 6 JDK의 jvisualvm 도구에 대해 살펴 보셨습니까?

실행중인 코드를 검사하는 데 적합합니다.

0

OOM이 발생할 때 힙 덤프가 필요하다는 것에 대해 논쟁을합니다. 시간이 지남에 따라 정보를 주기적으로 수집하면 진행 상황을 파악할 수 있습니다.

이러한 문제를 분석하기위한 다양한 도구가 관찰되었습니다. WebSphere 용 ITCAM을 통해 성공을 거두었습니다. IBM은 준비가되었습니다. 우리는 문제 상황에서 코드의 정확한 줄을 매우 빠르게 확인할 수있었습니다.

당신이 그런 성질의 도구를 얻을 수있는 방법이 있다면 그것은 갈 길입니다.

1

ITCAM에 대한 우리의 경험은 모니터링의 관점에서 보았을 때 별다른 성과를 내지 못했습니다. 우리는 그것을 CA Wily Introscope에 유리하게 버렸습니다.

0

커널에서 프로세스 목록을 가져 와서 스캔하여 WAS 프로세스가 아직 실행 중인지 확인하는 간단한 프로그램을 작성할 수 있어야합니다. 유닉스 박스에서 몇 분 안에 Perl에서 뭔가를 채찍질 할 수 있습니다 (Perl을 알고 있다면), Windows에서 얼마나 어려울 지 확신 할 수 없습니다. 5 분마다 예약 된 작업으로 실행하고 프로세스가 표시되지 않으면 힙 덤프를 처리하고 WAS를 다시 시작하는 다른 프로세스를 포크 할 수 있습니다.