Hibernate - java.lang.OutOfMemoryError: пространство кучи Java - PullRequest
0 голосов
/ 13 декабря 2011

Я получаю это исключение:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
    at java.lang.StringBuilder.append(StringBuilder.java:119)
    at java.util.AbstractMap.toString(AbstractMap.java:493)
    at org.hibernate.pretty.Printer.toString(Printer.java:59)
    at org.hibernate.pretty.Printer.toString(Printer.java:90)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:97)
    at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:35)
    at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1114)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)

По этому коду:

Query query = null;
        Transaction tx= session.beginTransaction();
        if (allRadio.isSelected()) {
            query = session.createQuery("select d from Document as d, d.msg as m, m.senderreceivers as s where m.isDraft=0 and d.isMain=1 and s.organization.shortName like '" + search + "' and s.role=0");
        } else if (periodRadio.isSelected()) {
            query = session.createQuery("select d from Document as d, d.msg as m, m.senderreceivers as s where m.isDraft=0 and d.isMain=1 and s.organization.shortName like '" + search + "' and s.role=0 and m.receivingDate between :start and :end");
            query.setParameter("start", start);
            query.setParameter("end", end);
        }
        final List<Document> documents = query.list();


        query = session.createQuery("select o from Organization as o");
        List<Organization> organizations = query.list(); <---AT THIS LINE
        tx.commit();

Я делаю 2 последовательных запроса. Если я закомментирую 1 из них, другой будет работать нормально.

если я удалю транзакцию, то исчезнет исключение. В чем дело? Это утечка памяти или что-то? Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 13 декабря 2011

Подсказка, которую я извлек из многолетней боли с такими вещами: ответ обычно тщательно скрыт где-то в первых 10 строках стека.Всегда читайте трассировку стека несколько раз, и если это не дает достаточной помощи, прочитайте исходный код методов, где происходит сбой.

В этом случае проблема возникает из-за симпатичного принтера Hibernate.Это функция ведения журнала, поэтому проблема в том, что Hibernate пытается записать какую-то огромную строку.Обратите внимание, как происходит сбой при попытке увеличить размер StringBuilder.

Почему он пытается записать огромную строку?Я не могу сказать по информации, которую вы предоставили, но я предполагаю, что в вашей организации есть что-то очень большое (возможно, BLOB?), И Hibernate пытается регистрировать объекты, которые запрос извлек из базы данных..

Лучше всего отключить эту функцию регистрации.Существует существующий вопрос по очень похожей проблеме, с некоторыми полезными предложениями в ответах.

2 голосов
/ 13 декабря 2011

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

Вы можете попытаться исправить ее, добавив следующий параметр в командную строку(что увеличит максимальный размер кучи; адаптируйте 512 м в соответствии с вашими потребностями):

java -Xmx512m yourprog

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

1 голос
/ 13 декабря 2011

Вам нужно увеличить размер кучи JVM.Запустите его с -Xmx256m параметром командной строки.

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