Подтвердить что ты не робот

Является ли запись журнала мусорной записи 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

спасибо заранее,

будет

4b9b3361

Ответ 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