У меня есть приложение (игра), работающее на JVM.java - после медленного приложения GC
Логика обновления игры (которая работает 60 раз/сек) заканчивается примерно на 25%, используемой ее «временной средой» (1/60 с), а затем сбрасывается с оставшихся 75%. Но когда собиратель GC собирается бежать, он поднимается до 75-200% и остается там для остальной части исполнения.
Игра использует около 70 Мб кучи и растет около 1-2 мб/с. Когда GC запускается, он возвращается к 70Mb, поэтому нет истинных утечек памяти. Я попытаюсь снизить это число в будущем, но это не должно быть проблемой в этой области.
Я использую JVM 8 без аргументов или флагов во время выполнения, не знаю, какой GC мне даст.
Я попытался установить кучу на разные размеры, но это не влияет на это явление.
У меня есть две теории относительно того, почему это может быть:
ГХ неумышленно фрагменты моей кучи таким образом, что вызывает кэш громя в цикле обновления. У меня есть логика, которая очень сильно выигрывает от близости данных, когда она проходит через нее и обновляет ее. Может быть, он перетасовывает некоторые данные в старую область, сохраняя некоторые в молодом возрасте (питомник)?
Внезапная обработка GC запускает мою ОС, заставляя ее понять, что мой основной протектор обновления не требует столько ресурсов ЦП, сколько в настоящее время, что снижает его приоритет. (Тем не менее, это явление сохраняется, даже если я пропустить Thread.sleep() отоспаться неиспользованным использованием процессора.
Что вы думаете. Являются ли мои теории правдоподобные, может что-нибудь сделать о них, или же я нужно переключиться на C-язык? Мои знания о GC ограничены.
PS В качестве примечания, как правило, обновление() заканчивается на 75% пост GC. При использовании VSync, когда я получаю цифры, как 200%.
возможно сравнить промахи кеша и связанные с ним статистику с 'perf record'? также, какой JVM? который коллекционер? какие флаги командной строки? – the8472
Спасибо, я добавил некоторую информацию к сообщению. Не уверен, что вы имеете в виду с «pref record», хотя .... – Jake
https://perf.wiki.kernel.org/index.php/Tutorial#Sampling_with_perf_record, и вы должны включить GC-журнал для получения информации о времени паузы (см. Документация JVM о том, как это сделать) – the8472