У меня есть приложение, работающее по расписанию 24x6. В настоящее время, после работы в течение нескольких дней, полный GC выполняется автоматически - и обычно в течение насыщенной части дня, что отрицательно влияет на время ответа пользователя.
То, что я хотел бы сделать, это заставить Full GC - возможно, в полночь каждую ночь, в течение очень низкого времени использования - чтобы это не происходило в течение дня. Я пробовал System.gc(), но, похоже, это не гарантирует, когда произойдет полный GC, или даже если это произойдет. Есть ли способ сделать это?
Информация о версии:
Java (TM) SE Runtime Environment (сборка 1.6.0_11-b03)
Java HotSpot (TM) Server VM (сборка 11.0-b16, смешанный режим)
Дополнительно -
- Незначительные GC работают примерно каждые 10-15 секунд. Но они не освобождают достаточное количество ОЗУ, чтобы получить приложение через всю неделю. Когда Full GC действительно происходит, почти 50% кучи освобождается.
- Что касается вышеизложенного, вызов System.gc() не означает, что любой из следующих GCs будет иметь полную форму, необходимую для освобождения этих больших патронов памяти. Да, он включен (или не отключен, в зависимости от того, как вы читаете параметр -XX).
- Я уже играл с несколькими настройками GC CMS, что очень помогло, но не решило проблему. Первоначально он бросал OOMs два-три раза в неделю.
- Я хочу остановить бесконечные циклы:
- постоянно добавляя в кучу пространство, которое может продолжаться так долго
- постоянная настройка и тестирование настроек GC - это уже давно минус возвращение
- Я не хочу рассматривать это как машину NT и отказываться от нее в ночное время. Активные пользовательские сессии в течение всей ночи, и подпрыгивание приложения означало бы потеря данных сеанса.
Чтобы быть более конкретным, я больше ищу технику, чтобы гарантировать, что будет выполнен полный GC, а не простой метод/функция для вызова для его запуска.
На данный момент я смотрю на изменение процентного порога, используемого CMS, чтобы определить, когда требуется полный GC.
Спасибо за любую помощь.