Я работаю над переносом моего 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), и убедитесь, что вы закрываете все свои операторы и совершаете свои транзакции.