수명이 짧은 쓰레기를 많이 생성하는 응용 프로그램의 경우 작동 할 수있는 한 가지 접근 방법은 거의 모든 기능을 갖춘 큰 힙이며 거의 모든 기능을 갖추고 있으며 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가 필요한 원인을 알 수 있습니다 (일명 바이트 코드가 모든 스레드에 의해 실행되고 있지 않음).
젊은 세대가 큰 경우, 값이 싼 젊은 세대의 수집품에서 반감기가 긴 개체가 사라져서 값 비싼 세대가 줄어 듭니다. – gustafc
@elec : 나는 여기 당신을 도울 수 없다 ... 그러나 당신의 질문은 자바와 그 "자동화 된"(메모리 관리가 어떻게 자동화되는지 보자) 메모리의 근본적인 문제에 대한 증상이다. Java (10 년)를 더 많이 사용할수록 메모리를 직접 관리 할 수 있기를 바랍니다. (예, 수십 년 전에 2 세대 언어를 포함하는 수동 메모리 관리를 요구하는 언어로 작업했습니다. Java 세계에서 낭비되는 에너지와 시간이 얼마나 비상 한 GC를 이해하고 "미세 조정"하려고하는지 ... 문제가 아닌 것 : C++로 돌아가고 싶습니다. – SyntaxT3rr0r
@WizardOfOdds - 당신과 동의합니다 ... 자바처럼 아주 낮은 대기 시간이 요구되는 환경에서 사용하기에 적합한 도구가 아닌 것 같습니다. – Eleco