У меня есть программа, которая постоянно работает.Обычно кажется, что сборщик мусора занимает около 8 МБ памяти.Однако каждые выходные он отказывается собирать мусор, если я не сделаю явный вызов.Однако, если он приближается к максимальному размеру кучи, он все равно будет собирать мусор.Однако единственная причина, по которой эта проблема была замечена, заключается в том, что она фактически вылетала из-за нехватки памяти в один из выходных, то есть она достигла максимального размера кучи и не запустила сборщик мусора.
На следующем рисунке (нажмите, чтобы увидеть) представляет собой график использования памяти программой за день.По бокам графика вы можете увидеть нормальное поведение использования памяти программой, но первый большой пик - это то, что начинается в выходные.Этот конкретный график является странным примером, потому что после того, как я сделал явный вызов сборщику мусора, он успешно запустился, но затем он вернулся и поднялся до максимального размера кучи и успешно собирал мусор сам по себе дважды.
Что здесь происходит?
РЕДАКТИРОВАТЬ:
Хорошо, судя по комментариям, я не предоставил достаточно информации.Программа просто получает поток пакетов UDP, которые помещаются в очередь (максимальный размер которых составляет 1000 объектов), которые затем обрабатываются для сохранения их данных в базе данных.В среднем он получает около 80 пакетов в секунду, но может достигать пика до 150. Он работает под управлением Windows Server 2008.
Дело в том, что это действие достаточно согласованно и, если вообще, во время, когда памятьиспользование начинает расти, активность должна быть ниже, а не выше.Напомним, что график, который я выложил выше, - единственный, который у меня есть, который простирается до этого уровня, поскольку я изменил только оболочку Java Visual VM, чтобы сохранить данные графика достаточно далеко, чтобы увидеть их на этой неделе, поэтому я понятия не имею, точно ли этов одно и то же время каждую неделю, потому что я не могу смотреть его в выходные дни, так как он находится в частной сети, и я не на работе в выходные дни.
Вот график следующего дня:
Примерно так выглядит использование памяти каждый второй день недели.Программа никогда не перезапускается, и мы говорим о сборе мусора только в понедельник утром из-за этой проблемы.Однажды мы попытались перезапустить его в пятницу после полудня, и он все еще начал расти в выходные, поэтому время, когда мы перезапускаем его, похоже, не имеет никакого отношения к использованию памяти на следующей неделе.
Тот факт, что он успешно собирает мусор, собирает все эти объекты, когда мы говорим об этом, подразумевает, что объекты можно собирать, он просто не делает этого, пока не достигнет максимального размера кучи, или мы явно не вызовем сборщик мусора.Дамп кучи ничего не говорит нам, потому что, когда мы пытаемся его выполнить, он неожиданно запускает сборщик мусора, а затем выводит дамп кучи, что, конечно, выглядит совершенно нормально на этом этапе.
Итак, я полагаю, у меня есть два вопроса: почему он вдруг не собирает мусор так, как это делает остаток недели, и почему в одном случае сбор мусора происходит, когда он достигает максимумаРазмер кучи был неспособен собрать все эти объекты (то есть, почему бы было так много ссылок на столько объектов, что когда-то не должно быть)?
ОБНОВЛЕНИЕ:
Это утро было интересным.Как я уже упоминал в комментариях, программа работает на клиентской системе.Наш контакт в организации-клиенте сообщает, что в 1 час утра эта программа завершилась сбоем, и ему пришлось перезапустить ее вручную, когда он приступил к работе этим утром, и что снова серверное время было неправильным.Это проблема, с которой мы сталкивались в прошлом, но до сих пор эта проблема, казалось, никогда не была связана.
Просматривая журналы, которые создает наша программа, мы можем вывести следующую информацию:
- В 01:00 сервер каким-то образом повторно синхронизировал свое время, установив его на 00:28.
- В 00:45 (по новому, неправильному времени сервера) один из потоков обработки сообщений в программе выдал ошибку нехватки памяти.
- Однако другой поток обработки сообщений (есть два типа сообщений, которые мы получаем, они обрабатываются немного по-разному, но оба они постоянно поступают), продолжает работать, и, как обычно, использование памяти продолжает расти с нет сборки мусора (как видно из графиков, которые мы записывали, еще раз).
- В 00:56 журналы останавливаются примерно до 7 утра, когда наш клиент перезапустил программу. Однако график использования памяти за это время все еще неуклонно увеличивался.
К сожалению, из-за изменения времени сервера, это делает время на нашем графике использования памяти ненадежным. Тем не менее, похоже, что он попытался собрать мусор, потерпел неудачу, увеличил пространство кучи до максимально доступного размера и сразу уничтожил этот поток. Теперь, когда максимальный объем кучи увеличился, он счастлив использовать все это, не выполняя большую сборку мусора.
Итак, теперь я спрашиваю: если время сервера внезапно меняется, как это произошло, может ли это вызвать проблемы с процессом сбора мусора?