Сборщик мусора Java - не работает нормально через равные промежутки времени

У меня есть программа, которая работает постоянно. Обычно создается впечатление, что он собирает мусор и остается менее 8 МБ используемой памяти. Однако каждые выходные он отказывается собирать мусор, если я не вызываю его явно. Однако, если он приближается к максимальному размеру кучи, он все равно будет собирать мусор. Однако единственная причина, по которой эта проблема была замечена, заключается в том, что он фактически аварийно завершил работу из-за нехватки памяти в один уик-энд, т.е. он должен был достичь максимального размера кучи и не запускать сборщик мусора.

Следующее изображение (щелкните, чтобы увидеть) представляет собой график использования памяти программой за день. По бокам графика вы можете видеть нормальное поведение использования памяти программой, но первый большой пик - это то, что, кажется, начинается в выходные. Этот конкретный график представляет собой странный пример, потому что после того, как я сделал явный вызов сборщику мусора, он работал успешно, но затем он пошел и поднялся до максимального размера кучи и успешно собрал на нем мусор ' дважды.

Что здесь происходит?

РЕДАКТИРОВАТЬ:

Хорошо, судя по комментариям, я не предоставил достаточно информации. Программа просто получает поток UDP-пакетов, которые помещаются в очередь (максимальный размер 1000 объектов), которые затем обрабатываются, чтобы их данные сохранялись в базе данных. В среднем он получает около 80 пакетов в секунду, но может достигать пика до 150. Он работает под Windows Server 2008.

Дело в том, что эта активность довольно последовательна, и, во всяком случае, в то время, когда начинается использование памяти, она устойчивый подъем, активность должна быть ниже, а не выше. Имейте в виду, что график, который я опубликовал выше, является единственным, который у меня есть, который уходит так далеко, поскольку я только изменил оболочку Java Visual VM, чтобы сохранить данные графика достаточно далеко, чтобы увидеть их на этой неделе, поэтому я понятия не имею, каждую неделю в одно и то же время, потому что я не могу смотреть его по выходным, так как он находится в частной сети, и я не на работе в выходные.

Вот график следующего дня: alt text

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

Тот факт, что он успешно собирает все эти объекты, когда мы говорим, что подразумевает, что объекты можно собирать, он просто не выполняет этого, пока не достигнет максимального размера кучи, или мы явно вызываем сборщик мусора. Дамп кучи нам ничего не говорит, потому что, когда мы пытаемся его выполнить, он внезапно запускает сборщик мусора, а затем выводит дамп кучи, что, конечно, выглядит совершенно нормально на данном этапе.

Итак, я полагаю, у меня есть два вопроса: почему он внезапно не выполняет сборку мусора, как это происходит в остальную часть недели, и почему в одном случае сборка мусора, которая происходит при достижении максимального размера кучи, была невозможно собрать все эти объекты (т.е. почему могут быть ссылки на такое количество объектов, когда один раз, а в другой раз их быть не должно)?

ОБНОВЛЕНИЕ:

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

Просматривая журналы, которые создает наша программа, мы можем вывести следующую информацию:

  1. На 01 : 00, сервер как-то обновил время, установив его на 00:28.
  2. В 00:45 (согласно новому некорректному времени сервера) один из потоков обработки сообщений в программе выдал ошибку нехватки памяти.
  3. Однако другая цепочка обработки сообщений (есть два типа сообщений, которые мы получаем, они обрабатываются немного по-разному, но оба приходят постоянно), продолжает работать и, как обычно, использование памяти продолжает расти без сбора мусора (как видно из графиков, которые мы снова записывали).
  4. В 00:56, журналы останавливаются примерно до 7 утра, когда программа была перезапущена нашим клиентом. Однако график использования памяти в это время все еще неуклонно увеличивался.

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

Итак, теперь я спрашиваю: если время сервера внезапно изменится, как это произошло, может ли это вызвать проблемы с процессом сборки мусора?

16
задан Ogre 6 December 2010 в 00:05
поделиться