Ошибка памяти кучи Java - PullRequest
       0

Ошибка памяти кучи Java

4 голосов
/ 10 августа 2010

Я получаю эту ошибку:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:1585)
    at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1409)
    at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2886)
    at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:476)
    at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2581)
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1757)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2171)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2512)
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1476)
    at DBase.connect(automateExport.java:31)
    at automateExport.main(automateExport.java:10)

Я попытался увеличить пространство памяти кучи, открыв файл eclipse.ini, а затем изменив

-Xms 256m and -Xmx 512m

Но это не помогло. Я пробовал 512 м и 1024 м, но это привело к ошибке: не удалось запустить JVM, а затмение не открылось.

Я попытался сделать то же самое в строке cmd:

java -Xms 256m and -Xmx 512m

, а также затмение -vmargs -Xms 256m and -Xmx 512m Но все равно не поможет. Я в основном создаю соединение JDBC для запроса базы данных для очень большого набора записей. Пожалуйста, помогите мне.

Ответы [ 6 ]

9 голосов
/ 10 августа 2010

Когда ваш запрос возвращает очень больших наборов, драйвер mysql по умолчанию загрузит весь набор результатов в память, прежде чем вернуть вам контроль.Похоже, вам просто не хватает памяти, поэтому увеличьте объем памяти, например -Xmx1024M

Другой альтернативой может быть включение потоковой передачи результатов по запросам MySQL - это предотвращает загрузку всего ResultSet впамять все сразу.Это можно сделать, выполнив

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, 
           java.sql.ResultSet.CONCUR_READ_ONLY);//These are defaults though,I believe
stmt.setFetchSize(Integer.MIN_VALUE);

(обратите внимание, что все, кроме Integer.MIN_VALUE не влияет на драйвер MySQL)

1 голос
/ 10 августа 2010

Вам не нужно слишком беспокоиться о -Xms - это начальный размер кучи при запуске.

-Xmx - максимальный размер кучи. Попробуйте увеличивать его, пока либо вы больше не получите исключение OutOfMemory, либо пока не закончится память.

Если вам не хватает памяти, вы не можете загрузить весь ResultSet сразу, и вам нужно будет применить подходы, упомянутые другими.

0 голосов
/ 16 ноября 2012

Я обнаружил, что драйвер MySql имеет утечку памяти.Я использую его с Tomcat в настройке пула соединений.Нагрузки JDBCResultSet и StatementImpl находятся в куче.Помогла установка maxAge в конфигурации источника данных (context.xml) в tomcat.

0 голосов
/ 10 августа 2010

Может ли Lazy Load применяться? Можете ли вы использовать верхний предел для ограничения результатов кусочного запроса?

0 голосов
/ 10 августа 2010

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

Если ваше решение данной проблемы плохо масштабируется с количеством имеющихся данных, вы вернетесь к этой проблеме, даже увеличив объем ОЗУ.,Так что действительно хорошее решение - это вообще избежать ситуации.

0 голосов
/ 10 августа 2010

Попробуйте разбить ваши данные на несколько наборов результатов. Подумайте, что вы хотите сделать с данными, как только вы вернете их из базы данных. Набор результатов слишком велик для размещения в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...