Я бегу приложение сервера на 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. Значения журнала не связаны напрямую с флагами?
Обычно я рекомендую разработчикам удалить все варианты, которые они не понимают. JVM имеет разумные значения по умолчанию, и нет смысла предполагать, что он знает более высокую ценность, чем JVM, даже не понимая фактического значения параметра. – Holger
Проблема в том, что если я не устанавливаю флаги metaspace, сервер запускается для большого количества gc в процессе запуска. И я считаю, что это связано с тем, что metaspace становится полным, поскольку для 64-битного сервера это как-то вроде 21mb. Когда я устанавливаю флаг, полного gc не происходит. Моя проблема решена. Но я все еще хочу понять несоответствие журнала и флага. –
«-XX: MetaspaceSize» не указывает начальный размер, но порог, при котором должен запускаться gc. Таким образом, пока фактический размер метаускопа меньше этого, он не вызывает gc. Но этот порог не является постоянным. Во время выполнения JVM может выбирать новые значения на основе фактического использования. Но так или иначе, почему это * время запуска * сервера * так важно? Не имеет смысла настраивать параметры для долговременной производительности? – Holger