Как ограничить потребление кучи без установки флага -Xmx
проблема
У меня есть файл.xlsx с множеством формул. Я хочу преобразовать этот файл в новый файл.xlsx со всеми формулами, замененными его абсолютным значением. Зачем? вероятно, не связано с этим вопросом.
Что я сделал?
Моя цель состояла в том, чтобы выполнить эту задачу при минимальном объеме памяти кучи. Поэтому я использовал комбинацию API событий Apache POI XSSF для чтения исходного файла и SXSSF API для записи выходного файла. Это сработало хорошо.
наблюдения
Все измерения проводятся с использованием JProfiler 10
Когда я запускаю свой код для преобразования файла размером около 25K+ строк (с формулой около 25K * 23), он использует около 250 МБ пространства кучи на пике. Теперь я выполнил ту же команду с -Xmx24M
и код может работать в пределах этого предела памяти, который значительно ниже, чем при первом запуске.
Вопросы
- Если мой код уже может работать в пределах этого низкого предела памяти, почему при первом запуске потребовалось более 250 МБ оперативной памяти?
- Можно ли ограничить этот конкретный фрагмент кода, чтобы ограничить его потребление памяти в пределах низкого предела, даже если Xmx не установлен?
1 ответ
Сборщик мусора не удосужился немедленно освободить память при первом запуске. Обработка файлов XLSX в конечном итоге приведет к генерации большого количества временных объектов, поэтому первый запуск позволяет им накопить до 250 МБ перед очисткой; в то время как второй прогон с ограничением памяти вынужден быстрее очищать объекты.
У сборщика мусора есть множество параметров и стратегий, которые можно настроить. Сверх того, я знаю, что единственный способ ограничить потребление только для этого конкретного кода - запускать этот код только в своем собственном процессе JVM с соответствующими параметрами GC.