2010-08-09 2 views
4

Я получаю эту ошибку:ошибка Java Heap памяти

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) 

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

-Xms 256m and -Xmx 512m 

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

Я попытался сделать то же самое на CMD линии:

java -Xms 256m and -Xmx 512m 

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

+0

Сколько записей? –

+0

Что это за приложение, можете ли вы более конкретно узнать, что вы хотите делать со всеми этими данными, как только вы его получите? Вы хотите показать его пользователю? делать расчеты? –

ответ

8

При запросе возвращается очень больших наборов, драйвер 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)

+0

Спасибо, ребята, за всю информацию. stmt = conn.createStatement (java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); // Это значения по умолчанию, хотя, я считаю, stmt.setFetchSize (Integer.MIN_VALUE); Это сработало !!! Так с облегчением! :) – JJunior

+0

К сожалению, это решение принесло исключение «Операция, не поддерживаемая для потоковых результирующих наборов», с Spring (2 mio records). К счастью, увеличение Xms действительно помогло. –

0

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

0

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

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

0

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

1

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

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

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

0

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

Смежные вопросы