2010-05-06 4 views
17

대기 시간이 중요한 환경에서 젊은 세대 (예전 세대와 관련하여)의 크기를 조정하는 가장 좋은 방법에 대한 논의를 찾고 있습니다.낮은 대기 시간에 대한 가비지 콜렉션 조정

내 자신의 테스트는 젊은 세대가 상당히 클 때 대기 시간이 가장 짧음을 보여 주지만 (예 : -XX : NewRatio < 3) 직감으로는 젊은 세대가 커질수록 대기 시간이 길어질수록 쓰레기 수거를해야합니다. 수명이

응용 프로그램은 6

메모리 사용량이 시작 (= 데이터 캐시)에로드되는 수명이 긴 개체의 50Megabytes에 관한 JDK, 리눅스 64 비트에서 실행, 그리고 거기에서 그것은 단지 (많은)의 매우 짧은 생성되는 개체 (평균 수명이 < 1 밀리 초).

일부 가비지 수집주기는 실행하는 데 10 밀리 초 이상 걸립니다 ... 앱 대기 시간과 비교하면 실제로 불균형 해 보입니다. 최대 대기 시간은 몇 밀리 초입니다.

+0

젊은 세대가 큰 경우, 값이 싼 젊은 세대의 수집품에서 반감기가 긴 개체가 사라져서 값 비싼 세대가 줄어 듭니다. – gustafc

+1

@elec : 나는 여기 당신을 도울 수 없다 ... 그러나 당신의 질문은 자바와 그 "자동화 된"(메모리 관리가 어떻게 자동화되는지 보자) 메모리의 근본적인 문제에 대한 증상이다. Java (10 년)를 더 많이 사용할수록 메모리를 직접 관리 할 수 ​​있기를 바랍니다. (예, 수십 년 전에 2 세대 언어를 포함하는 수동 메모리 관리를 요구하는 언어로 작업했습니다. Java 세계에서 낭비되는 에너지와 시간이 얼마나 비상 한 GC를 이해하고 "미세 조정"하려고하는지 ... 문제가 아닌 것 : C++로 돌아가고 싶습니다. – SyntaxT3rr0r

+0

@WizardOfOdds - 당신과 동의합니다 ... 자바처럼 아주 낮은 대기 시간이 요구되는 환경에서 사용하기에 적합한 도구가 아닌 것 같습니다. – Eleco

답변

14

수명이 짧은 쓰레기를 많이 생성하는 응용 프로그램의 경우 작동 할 수있는 한 가지 접근 방법은 거의 모든 기능을 갖춘 큰 힙이며 거의 모든 기능을 갖추고 있으며 YG 모음에서 생존하는 거의 모든 기능을 수행합니다. 한번 이상. 예를 들어

  • 3072M 힙 (XMS와 XMN)
  • 128M 종신 (당신이 32 비트 JVM을 가지고 말할 수) (즉,XMN의 2,944m)
  • MaxTenuringThreshold입니다 = 1
  • SurvivorRatio = 190 (즉, 각각의 생존 공간은 YG의 1백92분의 1)이다
  • TargetSurvivorRatio = 90 (즉, 가능한 한 그 생존자)

채우기 이 설정에 사용할 정확한 매개 변수는 작업 세트의 정상 상태 크기 (즉, 각 수집 시간에 얼마나 많은 양이 살아 있는지)에 따라 다릅니다. 여기서 생각하는 것은 분명히 정상적인 힙 크기 조정 규칙에 어긋나지 만 그런 식으로 행동하는 앱은 없습니다. 그 생각은 앱이 대부분 수명이 짧은 쓰레기이고 정적 데이터가 약간이므로 jvm을 높게 설정하면 정적 데이터가 빨리 보호되고 YG가 커지기 때문에 수집되지 않아 자주 최소화됩니다. 일시 정지의 빈도 당신은 좋은 크기가 당신을 위해 무엇인지 알아 내기 위해 노브를 반복적으로 회전해야 할 것입니다. & 컬렉션 당 얻을 수있는 일시 정지 크기와 균형을 유지하는 방법. 짧고 빈번한 YG 일시 중지가 예를 들어 달성 가능하다는 것을 알 수 있습니다.

앱을 실행하는 데 걸리는 시간은 지정하지 않지만 앱의 수명 기간 동안 소유권을 보유하지 않는 것이 목표입니다. 이것은 불가능할 수도 있지만 목표로 할만한 가치가 있습니다.

그러나 귀하의 경우 중요하다고 여기는 컬렉션 알 고만이 아니라 메모리가 할당 된 곳입니다. NUMA 수집기 (처리량 수집기와 만 호환되고 UseNUMA 스위치로 활성화 됨)는 개체가 자주 스레드를 사용하여 순수하게 사용한다는 관찰을 사용하여 & 따라서 적절하게 메모리를 할당합니다. 나는 리눅스에서 무엇을 기반으로하는지 모르지만 Solaris에서 MPO (메모리 배치 최적화)를 사용합니다. some details on one of the GC guys blogs

64bit jvm을 사용하고 있으므로 CompressedOops도 사용하고 있는지 확인하십시오.

개체 할당 속도 (일종의 과학 라이브러리일까요?)와 수명을 감안할 때 개체 재사용에 대해 고려해야합니다. 이 일을 lib 디렉토리의 한 예는 javalution StackContext입니다

마지막으로 그 GC 일시 정지가 유일한 STW 당신은 ​​PrintGCApplicationStoppedTime 및 PrintGCApplicationConcurrentTime 스위치에 약간의 수정이있는 6u21 early access 빌드 (효과적으로 인쇄로 실행할 수 있습니다, 일시 정지하지 주목할 필요가 글로벌 safepoint에서 시간과 그 safepoints 사이의 시간). tracesafepointstatistics 플래그를 사용하여 Safepoint가 필요한 원인을 알 수 있습니다 (일명 바이트 코드가 모든 스레드에 의해 실행되고 있지 않음).

5

동시 저 지연 수집기 알고리즘을 선택하는 것과 같은 관련 GC 설정을 이미 활성화 했습니까?

일반적으로 젊은 세대, 종신 세대 및 영구 세대는 신청서의 프로필에 맞게 크기를 조정해야합니다. 수명이 짧은 개체가 많지만 젊음이 너무 작 으면 개체의 수가 많아지기 때문에 많은 일반 세대의 주요 컬렉션을 더 자주 만듭니다. 마찬가지로 젊은이가 너무 큰 경우, 재직자는 필연적으로 더 작아지고, 재능있는 사람들을 많이 모집해야 할 수도 있습니다.

실질적으로 말해서, 젊은 세대와 대규모 세대에서 보낸 시간은 당신이 젊은 세대의 크기를 늘리면 변하고 어느 시점에서는 최적이라고 생각합니다.

"중요한"성능에 민감한 서버 응용 프로그램에서 일반적으로 젊은 세대를 줄이는 것이 필요하다는 것을 알았을 수도 있습니다. 이러한 응용 프로그램은 메모리 할당 핫스팟을 위해 이미 프로파일 링되어 최적화되어야하므로 수명이 짧은 개체가 거의 생성되지 않기 때문입니다. 이것은 젊은 세대가 힙을 너무 많이 먹고 있다는 것을 의미합니다.

그래서 먼저 최적화를 수행 한 다음 NewRatio를 8 이상으로 설정하고 -verbose : gc가 제공 한 출력을보고 GC와 Full GC 시간이 어떻게 교환되는지와 최적 인 곳을 확인합니다.

+0

FYI : 위에서 언급 한 낮은 일시 중지 수집기를 활성화하는 방법을 찾았으며이 겉보기 relavant 정보를 찾았습니다. http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#1.1.% 20Types % 20of % 20Collectors | outline 링크의 앵커 아래 # 2 항목을 참조하십시오. 그것은 "-Xincgc"또는 "-XX : + UseConcMarkSweepGC" –

1

Java로 실시간 애플리케이션을 시도 할 때 가비지 콜렉션 튜닝은 필수적이지만 생각해야 할 다른 측면 (예 : JIT 컴파일러, 타이머, 스레딩, 비동기 이벤트 처리)도 있습니다.

실시간 Java에 대한 수요가있는 것 같기 때문에 Sun은 Java Real-Time System 사양을 제공하며 상용 구현이 가능합니다. here에 대한 자세한 정보를 찾을 수 있습니다.

관련 문제