2011-04-07 2 views
1

Netty를 기반으로하는 서버 응용 프로그램이 있습니다. 메시지를 json에서 디코드 한 다음 클라이언트로 다시 보냅니다 (간단한 에코). 하나의 클라이언트 (15k/초 이상)에서 많은 양의 메시지를 보내면 가비지 컬렉터가 시작되지 않고 메모리 사용량이 늘어납니다.높은 부하에서 일반 gc에 대한 jvm conf

gc 일시 중지를 줄이고 메모리 사용을 줄이기 위해 jvm을 어떻게 구성 할 수 있습니까?

답변

2

설명이 메모리 누출 인 것처럼 보입니다. 가비지 컬렉터가 결국 시작 되나요, 아니면 OutOfMemoryError으로 끝나나요?

당신이 그렇지 않다면, 당신은 객체가 오래 유지 된 상태로 살아가고있는 것처럼 들리지만 나는 여기에 Sun JVM이 있다고 가정하고 있습니다. 그리고 그 해결책은 젊은 세대의 규모를 종신 세대에 비례하여 증가시키는 것입니다. 당신이 실험 할 것 http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

옵션을 : 여기

는 Sun JVM 세대 수집기를 (가 1.5 JVM을 위해,하지만이 옵션은 1.6이 변경되지 않았 음을 생각)을 설명하는 링크입니다 젊음과 tenured 발생 사이 비율 인 NewRatio 및 2 개 생존자 공간 사이에 비율 인 SurvivorRatio. 나는 다음과 같은 시도 할 수 있습니다 :

  • -XX:NewRatio=1는 개체 힙
  • -XX:SurvivorRatio=2의 젊은 세대의 절반을 제공 각각의 생존자 공간이 에덴의 절반이 될 수를 "에덴"을 만들 것입니다

이 두 설정 새로운 객체를위한 공간은 힙의 1/4을 차지합니다. 이것은 꽤 크고, 대부분의 사물들이 에덴에서 전 생애를 보내길 바랍니다. 생존자 배급은 생존자 공간 (각각 1/8)에 힙의 1/4을 제공하여 중간 정도의 대상을 보유합니다.

물론 맹목적으로 옵션을 설정하지 마십시오. 대신 jconsole (JDK 배포본의 일부)을 사용하여 힙에서 실제로 어떤 일이 일어나는지 확인하십시오. 기본 생존자 비율 (1 : 6)이 내가 제안한 것보다 낫다는 것을 알 수 있습니다.

0

gc 일시 중지를 줄이고 메모리 사용을 줄이려면 jvm을 구성하려면 적절한 GC 수집기를 선택해야합니다. CMS는 낮은 일시 중지 수집기입니다. 활성화하려면 -XX : + UseConcMarkSweepGC를 설정할 수 있습니다. 그리고, 당신은 세부적으로 조정할 수있는 다른 매개 변수 등

-XX

같은 : + UseCMSInitiatingOccupancyOnly
-XX : CMSInitiatingOccupancyFraction는 = 윈

이 GC 일시 정지를 제어합니다.