Java.sql.SQLException: недостаточно памяти, невозможно выделить запрошенный размер памяти

Я работаю над переносом моего 32-битного java-приложения (с использованием eclipse) с oracle 11g (ojdbc6.jar) на oracle 19c (ojdbc8.jar).

Сначала я получил «java.sql.SQLException: не удалось зафиксировать с автоматической фиксацией, установленной при ошибке», после поиска этой ошибки в Google она была решена добавлением «-Doracle.jdbc.autoCommitSpecCompliant = false».

Но затем после того, как приложение java работает более 30 минут, оно начинает получать другую ошибку «java.sql.SQLException: недостаточно памяти, невозможно выделить запрошенный размер памяти». Я отлаживаю приложение и обнаружил, что эта ошибка возникает при попытке выполнить оператор запроса.

ResultSet rs = myQueryStatement.executeQuery();

На форуме по «ошибке нехватки памяти» в основном предлагается добавить размер памяти, и, когда я проверил в своем приложении, он уже установил размер памяти на -Xmx500m -Xms100m, попытался увеличить максимальный объем памяти до -Xmx800m, также не смог разрешить ошибка. Я использую 8 ГБ оперативной памяти с 64-битной ОС ...

Я подозреваю, что это могло быть связано с установкой AutoCommit = false, потому что с oracle 11g такой ошибки нет.

Как я могу решить этот эрорр?

Caused by: java.sql.SQLException: Out Of Memory, Not able to allocate requested memory size
at oracle.jdbc.driver.T2CConnection.checkError(T2CConnection.java:1197)
at oracle.jdbc.driver.T2CConnection.checkError(T2CConnection.java:1060)
at oracle.jdbc.driver.T2CCallableStatement.doDefineFetch(T2CCallableStatement.java:1497)
at oracle.jdbc.driver.T2CCallableStatement.executeForRows(T2CCallableStatement.java:1011)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1012)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168)
at oracle.jdbc.driver.OracleStatement.doScrollExecuteCommon(OracleStatement.java:4789)
at oracle.jdbc.driver.OraclePreparedStatement.doScrollPstmtExecuteUpdate(OraclePreparedStatement.java:9882)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3661)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3713)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1167)

Проверьте фактическое использование кучи, когда вы получите эту ошибку (я подозреваю, что это может быть ресурс Oracle, который вызывает проблему, а не ресурс JVM), и убедитесь, что вы закрываете все свои операторы и совершаете свои транзакции.

tgdavies 02.04.2021 09:49

Я предполагаю, что у вас утечка памяти, но, не видя вашего кода, я могу только догадываться. Я предлагаю вам редактировать ваш вопрос и опубликовать минимальный воспроизводимый пример. Кроме того, похоже, что вы выполнили нет всю трассировку стека. Вы также должны опубликовать трассировку стека весь.

Abra 02.04.2021 09:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
32
0

Другие вопросы по теме