#java #heap-memory
#java #куча-память
Вопрос:
Привет, у меня есть Java-приложение, которое обрабатывает несколько записей из базы данных. Теперь, после обработки примерно 160 из них, запуск java выдает «OutOfMemoryError: пространство кучи Java». Из-за этого я обновил всю функцию, чтобы обрабатывать только 150 записей за один раз, что отлично работает, когда я просто вызываю эту функцию один раз, однако проблема заключается в том, что мне нужно обработать около 10000 записей, что означает, что мне приходится вручную запускать одну и ту же функцию более 60 раз.
Мой вопрос в том, есть ли способ, которым я могу поместить эту функцию в цикл и запускать ее в разное время, не сталкиваясь с проблемой. Я не могу понять, почему возникает эта проблема, поскольку функция является автономной и не использует какие-либо данные, сгенерированные предыдущим вызовом функции (как я уже сказал, я мог бы вручную запускать функцию около 60 раз и получить желаемый результат).
Заранее спасибо
Комментарии:
1. 1: Похоже, вы могли бы просто вызвать эту функцию в цикле. 2: Возможно, если вы опубликуете код, кто-нибудь сможет помочь вам выяснить, почему вы потребляете так много памяти.
Ответ №1:
Скорее всего, вы не закрываете свои Statement
(ы) и / или ResultSet
(ы). Они могут потреблять много ресурсов, пока открыты. Обязательно закройте их, когда закончите с ними!
Ответ №2:
Одной из наиболее вероятных причин этой проблемы является неправильная обработка открытых каналов / ресурсов. Пожалуйста, убедитесь, что каждый открытый дескриптор закрыт после выполнения его задания. Открытые результирующие наборы потребляют много ресурсов памяти. Кроме того, не рекомендуется зависеть только от JVM для управления памятью. Тщательно написанный код приведет к значительной оптимизации кода, даже если не делать этого намеренно.
Ответ №3:
я думаю, что вызывать функцию несколько раз — не самый лучший способ. ИМХО, вы должны написать процедуру хранения, которая обрабатывает все данные. База данных подготовлена для обработки большого количества данных.
Комментарии:
1. Я бы сохранил код в приложении, если это сложная бизнес-логика.
2. Если я не вижу кода, я должен думать, что sp — это лучший способ обработки данных. Архитектурно задание базы данных предназначено именно для этого. Но, опять же, я ничего не знаю о коде или логике. 🙂
3. Хорошо, итак, проблема выполнения цикла в том, чтобы узнать, где была последняя запись, которую вы обрабатывали, не так ли?
4. Нет, это не будет проблемой. Я бы написал запрос, который выбирает все данные из базы данных. При выполнении запроса отправляются не все данные, jdbc извлекает только первые X записей, а следующие X записей будут извлечены при перемещении курсора в результирующем наборе.