2009-04-03 4 views
4

IBM JDK 1.4.2를 사용하는 AIX의 Websphere Portal Server 5.1에서 포틀릿으로 상당히 복잡한 애플리케이션을 실행하고 있습니다. 우리 프로덕션 시스템에서는 자세한 GC 로그에서 이상한 동작을 볼 수 있습니다. 정상적인 동작 기간이 지나면 시스템은 더 큰 블록과 큰 블록을 빠르게 할당 할 수 있습니다. 시스템은 각 GC를 완료하기 위해> 1000ms를 소비하기 시작하지만 블록이 너무 빨리 할당되어 할당 실패 사이에 단지 30ms 간격이 있습니다.Websphere Portal Server와의 이상한 가비지 콜렉션 동작

  • 각 할당 실패는 마지막 정수보다 약간 큰 정수 x 1024 바이트만큼 커집니다. 예 : 5MB, 그리고 잠시 후 5MB + 17 * 1024가 될 수도 있습니다.
  • 이것은 최대 10 분 동안 지속될 수 있습니다.
  • 블록은 크기가 8MB에서 14MB까지 커지는 경향이 있습니다.
  • 쿼드 코어 시스템이며 다른 코어가 GC를 완료 할 때까지 기다리는 세 개의 코어로 GC를 수행하는 시간이 현재> 95 %라고 가정합니다. 10 분 동안. 아야.
  • 이 시점에서 분명히 시스템 성능이 떨어집니다.
  • 우리는 JSF, 최대 절전 모드 & JDBC, 웹 서비스 호출, log4j 출력 및 다른 것들을 가지고 있습니다.

이 코드는 응용 프로그램 코드가 아닌 인프라 구조로 해석됩니다. 루프 내부에서 잘못된 문자열 연결 인 경우 1024 블록보다 불규칙적 인 증가가 예상됩니다. StringBuffer 또는 ArrayList가 증가하면 블록 크기가 두 배가됩니다. 성장으로 인해 로그 버퍼링이나 다른 것을 생각하게되었습니다. 우리 애플 리케이션에서 아무 것도 생각할 수 없다. 할당량은 1MB, 14는 말할 것도 없다. 오늘은 디스크로 플러시되기 전에 메모리에 로깅을 기록했지만 GC 스레 싱의이 기간 동안 로깅 스테이트의 볼륨은 아무데도 없었다. MB 범위.

분명히 문제는 가비지 수집이 아니라 과도한 메모리 할당 때문입니다. 가비지 수집은 계속 유지하는 것이 최선입니다. 뭔가 큰 블록을 할당하고 너무 작은 단위로 비효율적으로 확장하려고합니다.

어떤 아이디어가 시스템에 부하가 걸렸을 때이 모든 원인이 될 수 있습니까? Portal Server와 비슷한 것을 본 사람이 있습니까?

참고 : 관심이있는 사람은 그 원인이 가끔씩 있지만 엄청난 데이터베이스 쿼리 인 것처럼 보이기 시작했습니다. 가장 큰 원인은 Hibernate 또는 JDBC 드라이버입니다.

답변

1

사용중인 IBM JDK의 정확한 버전에 따라 "큰 할당"을 추적하기위한 다양한 옵션이 있습니다. 차이점은 주로 구현에 있으며 결과는 특정 크기에 대한 할당이 이루어질 때 발생하는 로깅 Java 스택 추적입니다 (이로 인해 원인을 추적하는 데 도움이 됨).

"주권자"1.4.2 SR4 + : http://www-01.ibm.com/support/docview.wss?uid=swg21236523

는 "J9은"1.4.2 (자바 -Xj9 옵션에서 실행중인 경우) : 당신은 같은에 대한 JVMPI/JVMTI 에이전트의 보류를 얻을 필요 목적, 지금이 링크를 찾을 수 없습니다.

+0

IBM Java 5 및 6의 최신 버전에는 사용할 수있는 덤프 에이전트가 있습니다. 옵션은 -Xdump : stack : events = allocation, filter = # 입니다. 는 "5m"과 같은 직선 크기 또는 "256k..512k"와 같은 범위 일 수 있습니다. 그래도 "#"을 잊지 마세요! 자세한 정보는 Java 진단 안내서를 확인하십시오. –

2

문제점을 일으킬 수있는 것은 확실하지 않지만 자세한 조사 방법은 다음과 같습니다. IBM JDK는 SIGQUIT 신호를받을 때 힙 덤프를 수행하도록 구성 할 수 있으므로 위대합니다.
이전 프로젝트에서는 JDK가 아니었지만 조사 할 메모리가있을 때마다 사용할 것입니다. http://publib.boulder.ibm.com/infocenter/javasdk/v1r4m2/index.jsp?topic=/com.ibm.java.doc.diagnostics.142j9/html/enabling_a_heapdump.html

그런 다음 당신이 덤프에서 무엇을 볼 수있는 도구라는 heaproot있다 :

다음은 힙 덤프를 사용하는 방법은 다음과 같습니다.

개체 유형을 찾는 것이 원인으로 연결됩니다.

+0

힙 덤프를 수집하는 경우 http://eclipse.org/mat를 사용하여 파일을 분석하는 것보다 최악의 경우를 수행 할 수 있습니다. IBM DTFJ 힙 덤프 판독기 플러그인을 설치하면 힙에있는 대형 오브젝트를 찾아 볼 수있는 정말 멋진 인터페이스를 제공합니다. –

0

힙 조각화로 인해 주요 GC 문제 (Websphere 및 IBM JDK)가 발생한 프로젝트에 대한 힌트 만 있습니다. 마지막으로 힙 압축을 강제하는 JDK 스위치를 추가했습니다.

Sun JDK는 조각화 된 힙을 가지지 않지만 IBM JDK는 다른 메모리/GC 처리로 인해 발생합니다.

그냥 사용해보십시오 ... 나는 마법 스위치를 기억하지 못합니다.

+0

http://www.ibm.com/developerworks/ibm/library/i-incrcomp/ – trunkc

관련 문제