Означает ли запись в журнале сбора мусора Java "Full GC (System)" некоторый класс с именем System.gc ()? - PullRequest
23 голосов
/ 08 июля 2011

Что означает запись "Full 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 сек] [Times: user = 5.69 sys = 0.06, реальное = 5,75 с]

No-System:

166687.013: [Полный GC [PSYoungGen: 126501K-> 0K (922048K)] [PSOldGen: 2063794K-> 1598637K (2097152K)] 2190295K-> 1598637K (3019200K) [PSPermGen: 165840K-> 164249K (166016K)], 6,8204928 сек] [Times: user = 6.80 sys = 0.02, реальный = 6,81 с]

Опции GC

Наши параметры памяти Java, связанные с gc: -Xloggc: ../ сервер / pe / log / jvm_gc.log -XX: + PrintGCTimeStamps -XX: + PrintGCDetails

У нас нет '-XX: + DisableExplicitGC', поэтому возможно, что какой-то ошибочный класс вызывает System.gc ()

fwiw, наши полные опции jvm:

-Xms3072m -Xmx3072m -XX: + HeapDumpOnOutOfMemoryError -XX: -UseGCOverheadLimit -Xloggc: ../ сервер / pe / log / jvm_gc.log -XX: + PrintGCTimeStamps -XX: + PrintGXXeXer -XXMXPXeXSXEXS : + UseCompressedOops

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

будет

Ответы [ 2 ]

16 голосов
/ 08 июля 2011

Из исходного кода 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.По иронии судьбы это может означать, что вы получаете более полный сборщик мусора.;)

Я не использую RMI (за исключением, возможно, JConsole), поэтому я установил его на неделю.(Думаю, что по умолчанию час)

-Dsun.rmi.dgc.server.gcInterval=604800000
-Dsun.rmi.dgc.client.gcInterval=604800000
1 голос
/ 05 мая 2014

Я тестирую явный GC на моем Mac, он показывает «Full GC (System)» при использовании jdk 1.6, но показывает «Full GC» с jdk 1,7

Поэтому не полагайтесь на метку «Система» при настройке журнала GC, если вы точно не знаете, что такое работающая среда и номер версии jdk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...