2014-09-12 2 views
6

enter image description herePS 이전 세대 메모리 : GC 설정

다음

내 JVM 설정은 다음과 같습니다

JAVA_OPTS=-server -Xms2G -Xmx2G -XX:MaxPermSize=512M -Dsun.rmi.dgc.client.gcInterval=1200000 -Dsun.rmi.dgc.server.gcInterval=1200000 -XX:+UseParallelOldGC -XX:ParallelGCThreads=2 -XX:+UseCompressedOops -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jbos88,server=y,suspend=n 

문제 : 총 힙 메모리 : 2기가바이트 올드 세대 : 1.4GB (2/3 힙의 1/3)

Old Gen는 할당 된 크기가 70 %를 초과하여 메모리 크기가 증가하며 100 % 즉 1.4GB에서도 GC를받지 않습니다. 그래프 아래의 피크를 볼 수 있고 결코 GC가 아닌 것을 볼 수 있습니다. 메모리의 드롭은 JConsole에서 GC로 강제 실행될 때입니다. 이 문제는 결국 웹 서버를 중단시킵니다.

JVM이 누락되었거나 잘못 설정 되었습니까?

미리 도움을 주셔서 감사합니다.

내 질문 업데이트 : 우리는 Hibernate에 의해 지원 지속성 논리를 개최 상태 세션 빈을 enter image description here :이 상태 유지 세션 빈처럼 나타납니다

힙 분석 한 것은 유력한 용의자입니다.

+0

'OutOfMemoryError Heap Space'가있는 JVM 종료가 표시됩니까? 또는 이전 세대 GC가 더 빨리 실행될 것으로 예상합니까? –

답변

3

enter image description here 상태 기반 세션 빈으로 인해 JVM의 메모리가 부족합니다. @Remove 주석을 사용하여 명시 적으로 처리하면이 문제가 해결됩니다.

+0

어떻게 찾았습니까? – Nageswaran

4

GC가 결국 호출됩니다. 이전 세대는 거의 호출되지 않습니다 (매우 느리기 때문에). Gc는 실행되지만 처음에는 새로운 gen 및 survivor gen에서만 실행되며 이전 gen을 치료하기위한 완전히 다른 알고리즘을 사용합니다.이 알고리즘은 새로운/survivor gens보다 느립니다.

그 수는 실제로 높습니다. oldgen은 newgen에 비해 높은 수를 절대 도달해서는 안됩니다. 내 생각 엔 메모리 누수가있는 것 같습니다.

큰 파일을 다루는 프로그램 만 추측 할 수 있습니다. 오랫동안 그 파일에 대한 참조를 저장하고있을 것입니다.

3

에도 여전히 여전히 이전 세대가 자주 소형 일시 정지 삭제하려는 경우, 당신은

-XX:MaxGCPauseMillis=(time in millis) 

을 설정하려고 할 수 있습니다, 해결 된 주요 문제 (메모리 누수)을 갖는이 병렬 만 적용 적응 형 크기 조정 정책이 설정된 경우 수집기 및 기본적으로 Adaptive Sizing Policy는 켜져 있지만 명시 적으로 언급하려는 경우 사용할 수 있습니다.

-XX:+UseAdaptiveSizePolicy 

아니면 당신이는 이전 세대의 특정 부분에 도달하면 이전 세대를 수집하는 더 신뢰할 수있는 방법이다

-XX:CMSInitiatingOccupancyFraction=(% value) 
-XX:+UseCMSInitiatingOccupancyOnly 

를 사용할 수있는 CMS 수집기로 전환 할 수 있습니다.

+0

나는이 JVM 매개 변수를 사용했지만 분명히 GC는 오래된 gen 공간을 비울 수 없으며 매번 메모리를 거의 복구 할 수 없을 때마다 메모리를 영구히 비울 수 있습니다. – amitsalyan

+0

전체 GC 후에 메모리가 크게 복구되지 않으면 이전 세대의 메모리가 쓰레기가 아닙니다. 이 경우 응용 프로그램의 메모리 사용량이 될 수 있습니다. 그렇다면 할당 된 총 메모리를 늘려야합니다. Stateful Session Beans가 메모리의 주요 점유자라고 가정하면 메모리 풋 프린트가 대략적으로 (세션의 새 세션 * 세션 시간 * 평균 크기 생성 속도)와 같음을 나타냅니다. –

+0

다른 힙 분석을 공유하지 않는 이유는 무엇입니까? 최적화를 수행 한 후 (@Remove 어노테이션)? 그래서 나는 상황에 대한 더 나은 그림을 갖게 될 것이다. jmap -histo의 출력을보고 싶습니다.