1

CentOS 64 비트 Linux 시스템에서 jdk 1.7.0_09를 사용하고 있습니다.Old Generation이 반만 찼을 때 JVM이 지속적으로 full gc를 수행하는 이유는 무엇입니까?

VM 인수 관련 GC가

-Xmx4g -Xmn2g -XX이다 SurvivorRatio = 4 -XX : PermSize = 128m -XX :를 MaxPermSize = 128m -XX : InitialTenuringThreshold -XX = 15 : 50 = CMSWaitDuration -XX : MaxTenuringThreshold입니다 = 15 -XX : + UseConcMarkSweepGC -XX : + UseParNewGC -XX : CMSInitiatingOccupancyFraction = 80 -XX : + CMSParallelRemarkEnabled -XX :이 지속적으로 전체 GC를하고있어 ReservedCodeCacheSize = 128m

그러나

jstat -gcutil pid 1000  
    S0  S1  E  O  P  YGC  YGCT FGC FGCT  GCT 
    0.00 0.00 15.62 57.52 19.90  11 2.081 11109 7454.686 7456.767 
    0.00 0.00 15.81 57.52 19.90  11 2.081 11109 7454.686 7456.767 
    0.00 0.00 15.81 57.51 19.90  11 2.081 11111 7454.892 7456.973 
    0.00 0.00 16.06 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.06 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.27 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.27 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.29 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.29 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.29 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.29 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.34 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.34 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.34 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.42 57.47 19.90  11 2.081 11114 7455.549 7457.629 
    0.00 0.00 16.42 57.44 19.90  11 2.081 11115 7455.986 7458.067 

답변

2

열 "FGC"에도 불구하고 실제로는 완전한 GC가 아닙니다. CMS가 수행하는 작업은 이전 컬렉션에서 정리할 수있는 항목이 있는지를 확인할 수있는 동시 수집입니다. 전체 GC가 아니라는 것을 알 수있는 방법은 전체 GC가 에덴 공간을 제거하고 한 생존 공간에서 다른 생존 공간으로 복사본을 복사하는 것입니다.

IMHO 더 많은 옵션을 사용할수록 놀라운 결과가 나오는 조합을 많이 발견하게됩니다. 나는 최소한의 옵션을 고수하고 그것이 어떻게 수행되는지를 볼 것입니다. 항상 도움이 될 때만 옵션을 추가하십시오.

는 함께 정상

-mx4g -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC 
+0

동의합니다. 사용 된 플래그는 이것이 uggled 구성임을 나타냅니다. 정말로 "-XX : InitialTenuringThreshold = 15 -XX : CMSWaitDuration = 50 -XX : MaxTenuringThreshold = 15"을 원하면 그 이유를 알아야합니다. (그리고 나서 그들은별로 중요하지 않다는 것을 알게 될 것입니다.) –

+1

플래그가 순전히 최선의 노력을하고, 기본적으로 이미 활성화되어 있거나, 나타나지 않는 것처럼 보이는 경우가 종종 있습니다. '-ms'와'-mx' (일반적으로'-Xms'와'-Xmx'라고 알려짐)조차도 대부분의 사람들이 생각하는 것을하지 않습니다. –

+0

@FabianLange 우리는 gc 플래그의 다른 설정에 대해 우리의 응용 프로그램을 벤치마킹하고 마침내 이것에 정착했습니다. 일부 설정은 단지 제안 일뿐입니다. – Timmy

0

을 시작하려고합니다. 당신은 "-verbose : gc"를 할 것입니다. "Full"콜렉션이 실제로 동시 콜렉션 ("-XX : + UseConcMarkSweepGC"을 지정했습니다)을 볼 수 있습니다. 시간이 많이 증가하지 않는 것을 볼 수도 있습니다. 그리고 그 시간은 동시에 일어나고 멈추지 않습니다.