Сколько времени нужно потратить на сбор мусора

У меня есть приложение, которое отвечает за архивирование старых приложений, которое будет выполнять большое количество приложений за раз, и поэтому ему нужно будет работать в течение нескольких дней.

Когда моя компания разработала это, они провели честную проверку производительности на нем, и из-за этого они, похоже, получили приличные номера, но я недавно запускал архив для клиента, и, похоже, он работает очень медленно, и производительность, кажется, ухудшается еще дольше, чем она работает.

Кажется, что нет утечки памяти, поскольку, поскольку я контролирую ее с помощью jconsole, все еще имеется много доступной памяти и, похоже, не уменьшается.

Я заметил, однако, что пространство оставшихся в живых и теневой ген кучи очень быстро заполняются до тех пор, пока не появится сбор мусора и не очистит его, что, кажется, происходит довольно часто, и я не уверен, может ли это быть источником кажущегося замедления.

Приложение работает уже 7 дней 3 часа, и в соответствии с jconsole он потратил 6 часов на сборку мусора (772, 611 коллекций) и 12 часов и 25 минут на уплотнение marksweep (145 940 коллекций).

Это кажется большим количеством времени, потраченного на сбор мусора, и мне просто интересно, если кто-то заглянул во что-то подобное раньше и знает, нормально это или нет?

редактирует

Локальная обработка кажется медленной, например, я просматриваю одну часть в журналах, которая занимает 5 секунд, чтобы извлечь какой-либо xml из конверта SOAP, используя xpath, который затем добавляет в буфер строки вместе с корневым тегом. что все это делает. Я еще не профилировал его, так как это работает на производстве, мне придется либо вытащить данные по сети, либо создать большую тестовую базу в нашей среде разработчиков, которая может закончиться необходимостью.

Запуск Java HotSpot Client VM версии 10.0-b23

На самом деле просто нужна высокая пропускная способность, не настроены какие-либо конкретные параметры сбора мусора, будет выполняться то, что когда-либо было по умолчанию. Не знаете, как найти, какие коллекционеры будут использовать?

Fix

В конце концов, получив профайлер, он решил, что причиной замедления был какой-то код, который постоянно обрезал строки из окна состояния, выводя заявления о регистрации, которые были довольно плохо сделаны. Должно было понять, что сбор мусора был симптомом от постоянного копирования текста статуса в память, а не фактической причины.

Приветственные ребята.

Ответ 1

В соответствии с вашими цифрами общее время сбора мусора составляло около 18 часов из 7 дней исполнения. Примерно на 10% от общего времени выполнения, которое немного повысилось, но даже если вам удалось это сделать до 0%, вы сохранили бы только 10% времени выполнения... так что если вы ищете существенную экономию, вы лучше изучить остальные 90%, например, с помощью профилировщика.

Ответ 2

Без правильного профилирования это игра с угадыванием. Тем не менее, в течение нескольких лет назад, когда я пытался подключиться к JDK, веб-приложение, в котором я участвовал, внезапно замедлилось (время ответа) в 10 раз. Мы закончили тем, что преследовали его до явного призыва к GC, добавленного гением, который больше не был с компанией.

Ответ 3

Существует баланс, который вы будете пытаться поддерживать между следами кучи JVM и временем GC. Другой вопрос может заключаться в том, что у вас есть куча (и поколение) (недо), распределенная таким образом, что требует слишком частого GCing. При развертывании мути-арендаторов JVM в этой системе я пытался поддерживать баланс до менее 5% общего времени GC вместе с агрессивной усадкой кучи, чтобы поддерживать низкий уровень следа (опять же, многопользовательский). Куча и поколения будут в основном ВСЕГДА заполнять, чтобы избежать частых сборок в том, что установлено. Удалите параметр -Xms, чтобы увидеть более реалистичное устойчивое состояние (если у него есть время простоя)

+1 к предложению о профилировании; это может быть нечто, не связанное с GC, но код.