Что заставляет JVM выполнять большую сборку мусора?

У меня есть приложение Java, которое показывает различные поведения GC в разных средах. В одной среде график использования кучи представляет собой медленный пилообразный сигнал с основными GC каждые 10 часов или около того, только когда куча заполнена на> 90%. В другой среде JVM выполняет основные GC каждый час на точке (куча обычно составляет от 10% до 30% в это время).

Мой вопрос заключается в том, каковы факторы, которые заставляют JVM принять решение о проведении крупного GC?

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

Я предполагаю, что поведение GC сильно зависит от JVM; Я использую:

Java HotSpot (TM) 64-битный сервер ВМ 1.7.0_21 Корпорация OracleНикаких конкретных опций GC, поэтому используются настройки по умолчанию для 64-битного сервера (PS MarkSweep и PS Scavenge)

Другая информация:

Это веб-приложение, работающее в Tomcat 6.Пермский генерал колеблется около 10% в обеих средах.В среде с пилообразным поведением максимальная куча составляет 7 ГБ, в другой - 14 ГБ.

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