Раньше я использовал память нового поколения 2G, я видел, что минорный gc происходит каждые 10 секунд и занимает 0,1-0,15 секунды каждый раз, я хочу уменьшить незначительную частоту gc, поэтому я установил память нового возраста до 3G. После этого незначительный gc происходит каждые 15 секунд, но, однако, для завершения требуется около 0,3 секунды. Почему незначительное время GC увеличивается, когда я увеличиваю память нового возраста? Я заметил, что после увеличения памяти активный объект после GC увеличивается с 55M до 80M, в чем причина?Почему незначительное увеличение GC-времени при увеличении памяти нового возраста
ответ
Причина в том, что в большей области памяти больше живых объектов. Время GC в основном масштабируется с количеством (и общим размером) живых объектов, которые должны быть скопированы в область выживших.
Вы можете получить прибыль от более крупного региона молодого поколения только в том случае, если вы создаете много объектов, все из которых будут жить в одно и то же время и не будут полностью вписываться в YG. Это заставляет их закрепиться в Старом Поколении.
В противном случае общее время GC остается неизменным, и вы просто выбираете, как разбить его на отдельные события, происходящие в мире: более продолжительные и менее частые или более короткие и частые.
Моя логика приложения очень проста, она просто получает запрос, конвертирует полученные данные и отправляет на другой сервер. Поэтому я думаю, что живые объекты зависят от того, сколько запросов обрабатывается, так как после завершения запроса все объекты будут выпущены. Если запросы в секунду одинаковы, почему живые объекты увеличиваются при увеличении области памяти? – Xilang
Это вряд ли кто-то, кроме вас, может узнать. Может быть, есть меньше полномочий, как я описал? –
Я печатаю подробные данные о сроках хранения в журнале gc, независимо от того, до или после того, как я меняю память YG, в OG почти ничего нет. Фактически, почти все объекты собраны в возрасте 0 или 1 года. Разница заключается в 2G YG, возрасту 1 объект составляет около 55M, а с 3G YG, возрастом 1 объекта составляет около 80M. – Xilang
Если вы хотите увеличить время между молодыми коллекциями, вы хотите увеличить размер Eden. Когда вы меняете размер молодого поколения, вы, вероятно, также меняете две вещи: размер оставшихся в живых и порог владения. Определение срока хранения определяет, сколько раз объекты копируются взад и вперед между пространствами оставшихся в живых, прежде чем они будут переведены в пространство, на котором они находятся. Порог использования по умолчанию равен 4, но определенные параметры, такие как -Xmn
, изменяют порог владения до 15, если вы не указали его.
Вы можете увеличить пространство Eden, установив -XX:SurvivorRatio=8
форму примера и ограничить tenuring theshold сказать -XX:MaxTenuringThreshold=4
Недостаток предельного порога tenuring что больше объекта будет продвинут на tenuring пространства, которое помещает давление на Full GC.
Прежде чем пытаться использовать ваш GC, я всегда рекомендую вам сделать профиль памяти, смотрящий на распределение, например. с Flight Recorder. Часто я нахожу, что вы можете уменьшить скорость вашего мусора на 2-4x, и это значительно облегчит настройку вашего приложения.
В журнале GC я видел, что порог владения равен 6, как в случае с 2G, так и 3G. В OG почти ничего нет. Фактически, почти все объекты собраны в возрасте 0 или 1 года. Разница заключается в 2G YG, возрасту 1 объект составляет около 55M, а с 3G YG возрастные объекты возрастом около 80M. – Xilang
* «minor gc происходит каждые 10 секунд и занимает 0,1-0,15 секунды каждый» * - это от 1 до 1,5% времени на стене, проведенного в GC. Почему вы хотите меньше пауз? Разве вы не должны стремиться к индивидуальным более низким временам паузы, а если латентность запросов является проблемой? – the8472
@ the8472, загрузка моего сервера очень высока, но не используется много ресурсов памяти. Я хочу уменьшить GC для снижения загрузки процессора, кажется, не очень хорошая идея. – Xilang