2016-12-21 5 views
1

Я бегу приложение сервера на Java 8 с флагами ниже:Почему журнал сбора мусора Значение метапроцесса отличается от установленного флага?

-XX:GCLogFileSize=2097152 -XX:InitialBootClassLoaderMetaspaceSize=33554432 -XX:InitialHeapSize=1610612736 -XX:MaxHeapSize=1610612736 -XX:MaxMetaspaceSize=1073741824 -XX:MetaspaceSize=536870912 -XX:NumberOfGCLogFiles=5 -XX:+PrintGC -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseGCLogFileRotation -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC 

Meta значение пространства старт 512m и максимальное значение 1gb.

В журналах gc я вижу разные значения метаповерхности, чем приведенные выше значения флага. Мой образец журнала ниже:

{Heap before GC invocations=1 (full 0): 
PSYoungGen  total 458752K, used 393216K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000) 
    eden space 393216K, 100% used [0x00000000e0000000,0x00000000f8000000,0x00000000f8000000) 
    from space 65536K, 0% used [0x00000000fc000000,0x00000000fc000000,0x0000000100000000) 
    to space 65536K, 0% used [0x00000000f8000000,0x00000000f8000000,0x00000000fc000000) 
ParOldGen  total 1048576K, used 0K [0x00000000a0000000, 0x00000000e0000000, 0x00000000e0000000) 
    object space 1048576K, 0% used [0x00000000a0000000,0x00000000a00003a0,0x00000000e0000000) 
Metaspace  used 26975K, capacity 54120K, committed 54400K, reserved 1114112K 
    class space used 3346K, capacity 4426K, committed 4480K, reserved 1048576K 
2016-12-21T16:41:10.569+0300: 1.423: [GC (GCLocker Initiated GC) [PSYoungGen: 393216K->29645K(458752K)] 393216K->29734K(1507328K), 0.0241803 secs] [Times: user=0.11 sys=0.00, real=0.02 secs] 
Heap after GC invocations=1 (full 0): 
PSYoungGen  total 458752K, used 29645K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000) 
    eden space 393216K, 0% used [0x00000000e0000000,0x00000000e0000000,0x00000000f8000000) 
    from space 65536K, 45% used [0x00000000f8000000,0x00000000f9cf3460,0x00000000fc000000) 
    to space 65536K, 0% used [0x00000000fc000000,0x00000000fc000000,0x0000000100000000) 
ParOldGen  total 1048576K, used 88K [0x00000000a0000000, 0x00000000e0000000, 0x00000000e0000000) 
    object space 1048576K, 0% used [0x00000000a0000000,0x00000000a00163b0,0x00000000e0000000) 
Metaspace  used 26975K, capacity 54120K, committed 54400K, reserved 1114112K 
    class space used 3346K, capacity 4426K, committed 4480K, reserved 1048576K 
} 

Так что мой вопрос, почему я не вижу значение 512M и 1ГБ для Метапространства в журналах Gc. Значения журнала не связаны напрямую с флагами?

+1

Обычно я рекомендую разработчикам удалить все варианты, которые они не понимают. JVM имеет разумные значения по умолчанию, и нет смысла предполагать, что он знает более высокую ценность, чем JVM, даже не понимая фактического значения параметра. – Holger

+0

Проблема в том, что если я не устанавливаю флаги metaspace, сервер запускается для большого количества gc в процессе запуска. И я считаю, что это связано с тем, что metaspace становится полным, поскольку для 64-битного сервера это как-то вроде 21mb. Когда я устанавливаю флаг, полного gc не происходит. Моя проблема решена. Но я все еще хочу понять несоответствие журнала и флага. –

+1

«-XX: MetaspaceSize» не указывает начальный размер, но порог, при котором должен запускаться gc. Таким образом, пока фактический размер метаускопа меньше этого, он не вызывает gc. Но этот порог не является постоянным. Во время выполнения JVM может выбирать новые значения на основе фактического использования. Но так или иначе, почему это * время запуска * сервера * так важно? Не имеет смысла настраивать параметры для долговременной производительности? – Holger

ответ

0

Как объяснено в “Advanced Garbage Collection Options”:

-XX: MetaspaceSize = размер

Устанавливает размер пространства метаданных выделено класса, которые будут вызывать сборку мусора в первый раз, то превышены. Этот порог сбора мусора увеличивается или уменьшается в зависимости от количества используемых метаданных. Размер по умолчанию зависит от платформы.

Другими словами, он не задает начальный размер, но порог дс в первый раз, так что он соответствует наблюдаемое поведение, не имея полного дс, а фактический размер Метапространство меньше указанный размер.

Как только порог был превышен в первый раз, JVM может выбрать новый порог, основанный на фактическом использовании.

 Смежные вопросы

  • Нет связанных вопросов^_^