Является ли запись журнала мусорной записи java "Полный GC (System)" означает некоторый класс под названием System.gc()?
Что означает запись "Полный GC (System)" в журналах сбора мусора? Что-то вроде класса System.gc()?
Мои журналы сбора мусора имеют два разных типа записи для "full gc"? Один со словом "Система", другой без. Какая разница?
(Обновление: я искал этот термин и не нашел окончательного ответа, всего несколько вопросов. Поэтому я решил опубликовать его).
Система:
164638.058: [Полный GC (Система) [PSYoungGen: 22789K- > 0K (992448K)] [PSOldGen: 1645508K- > 1666990K (2097152K)] 1668298K- > 1666990K (3089600K) [PSPermGen: 164914K- > 164914K (166720K)], 5.7499132 secs] [Times: user = 5.69 sys = 0.06, real = 5.75 сек]
нет
Нет-System:
166687.013: [Полный GC [PSYoungGen: 126501K- > 0K (922048K)] [PSOldGen: 2063794K- > 1598637K (2097152K)] 2190295K- > 1598637K (3019200K) [PSPermGen: 165840K- > 164249K (166016K)], 6.8204928 secs] [Times: user = 6.80 sys = 0,02, real = 6.81 secs]
Параметры GC
Наши параметры java-памяти, связанные с gc:
-Xloggc:../server/pe/log/jvm_gc.log -XX: + PrintGCTimeStamps -XX: + PrintGCDetails
Мы не '-XX: + DisableExplicitGC', поэтому, возможно, какой-то странный класс вызывает System.gc()
fwiw, наши полные параметры jvm:
-Xms3072m -Xmx3072m -XX: + HeapDumpOnOutOfMemoryError -XX: -UseGCOverheadLimit -Xloggc:../server/pe/log/jvm_gc.log -XX: + PrintGCTimeStamps -XX: + PrintGCDETails -XX: MaxPermSize = 256m -XX: + UseCompressedOops
спасибо заранее,
будет
Ответы
Ответ 1
Из источника для OpenJDK я бы сказал, что это
const bool is_system_gc = gc_cause == GCCause::_java_lang_system_gc;
// This is useful for debugging but don't change the output the
// the customer sees.
const char* gc_cause_str = "Full GC";
if (is_system_gc && PrintGCDetails) {
gc_cause_str = "Full GC (System)";
}
Я создал пользовательскую версию класса Runtime для записи имени потока и трассировки стека в файл всякий раз, когда вызывается Runtime.getRuntime(). gc(). (System.gc() вызывает это) Я нашел полезным при отслеживании и удалении таких вызывающих абонентов.
Одно место это происходит в классе sun.misc.GC. RMI попросит этот класс обеспечить, чтобы GC выполнял за последние N секунд. Если не было GC, он запускает полный GC.
Это показывает только проблему, если вы уменьшите количество младших GC. Иронически это может означать, что вы получите больше полных GC.;)
Я не использую RMI (кроме, возможно, JConsole). Поэтому у меня он установлен на неделю. (Думайте, что по умолчанию час)
-Dsun.rmi.dgc.server.gcInterval=604800000
-Dsun.rmi.dgc.client.gcInterval=604800000
Ответ 2
Я тестирую явный GC на моем mac, он показывает "Full GC (System)" при использовании jdk 1.6, но показывает "Full GC" с jdk 1.7
Поэтому не следует полагаться на метку "System" при настройке журнала GC, если вы точно не знаете о рабочей среде и номере версии jdk