Мне было поручено решить проблемы OutOfMemoryError при установке Solr. Наконец-то мне удалось заставить его работать дольше нескольких минут, используя опцию AggressiveHeap JVM.
Я никогда не работал с Solr, поэтому чувствую себя немного лучше.
Это процесс, который мы предпринимаем:
- Запустите Tomcat
- Начать дельта-импорт
После запуска дельта-импорта потребление кучи неумолимо возрастает. Мы попытались установить Xmx на 4 гигабайта, что привело к тому, что OutOfMemoryErrors или система перестали отвечать на запросы, поэтому попробовали опцию AggressiveHeap, которая заставила JVM занять около 5,5 гигабайт оперативной памяти. Как вы можете видеть на скриншоте, на этот раз GC смог освободить память, потребление памяти стало менее быстрым, и затем справа от изображения появился еще один GC, который действительно работает, и продолжает работать так.
Что это за первоначальное распределение памяти? Индекс загружается в ОЗУ? Есть ли способ уменьшить это?
Я попытался настроить ramBufferSizeMB, maxBufferedDocs, mergeFactor, а также раскомментировал объявление StandardIndexReaderFactory, чтобы позволить мне установить termIndexDivisor в 12, но трудно понять, имели ли эти изменения какое-то значение или нет (да: требуется дополнительный анализ) .
Индекс был создан в течение нескольких неудачных сеансов индексирования - добавление параметра termIndexDivisor является более новым - неужели тот факт, что файлы индекса уже существуют, мешает этому параметру оказывать какое-либо влияние?
(Машина физическая, имеет 12 гигабайт оперативной памяти и 16 ядер. Она разделяет машину с другим крупным экземпляром Tomcat. Мы используем Oracle JDK 1.6 21)