Показаны сообщения с ярлыком error. Показать все сообщения
Показаны сообщения с ярлыком error. Показать все сообщения

вторник, 18 августа 2009 г.

Hibernate: ошибка связанная с SLF4J

Проблема:
При запуске нового проекта на Hibernate 3.3.2 скопированы с архива (папка lib) все необходимые библиотеки, в том числе и slf4j-api-1.5.8.jar.
Но при старте теста появляется ошибка:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Exception in thread "main" java.lang.ExceptionInInitializerError

Решение:
На сайте http://www.slf4j.org/codes.html#StaticLoggerBinder эту ошибку описывают так:
"This error is reported when the org.slf4j.impl.StaticLoggerBinder class could not be loaded into memory. This happens when no appropriate SLF4J binding could be found on the class path. Placing one (and only one) of slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar on the class path should solve the problem."
То есть нужно в пути к библиотекам добавить один из (и только один slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar)

Скачать необходимую библиотеку можно с сайта http://www.slf4j.org/dist/ (берем ту же версию, что и slf4j-api).
В Jar архиве есть необходимые библиотеки.
Я взял slf4j-jdk14-1.5.8.jar.

четверг, 12 февраля 2009 г.

java ConcurrentModificationException

Эта ошибка может возникнуть в случае, когда происходит попытка изменить коллекцию внутри итерации этой же коллекции. Например:
List originalList = new ArrayList();
for (Iterator it =
originalList.iterator(); it.hasNext(); ) {
originalList.add(someObject);
}

Решение: создать копию коллекции и изменять нужную коллекцию внутри итерации по копии. Пример:
List copy = new ArrayList(originalList);
for (Iterator it = copy.iterator(); it.hasNext(); ) {
originalList.add(someObject);
}

Заметка: можно также использовать специальные классы колекций (что-то типа
CopyOnWriteArrayList), но в большинстве случаев лучше использовать копии.
Для дополнительной информации:

Class ConcurrentModificationException (англ.)

описание решения проблемы на форуме Sun (англ.)

пятница, 7 ноября 2008 г.

решение проблемы: java.lang.OutOfMemoryError: PermGen space


При возникновении ошибки java.lang.OutOfMemoryError: PermGen space
Eclipse
может просто неожиданно завершить работу и предложить просмотреть логи.
Хочу заметить, что я впервые встретился с этой ошибкой, когда начал использовать Eclipse для рисования UML диаграмм. То есть в тот момент, когда Eclipse начал использовать плагины org.eclipse.gef и org.eclipse.emf,
а эти плагины есть также в Eclipse IDE for Java EE Developers. В этом можно убедиться тут.
Также эта ошибка может появляться при использовании HQL запросов, когда активно используется Hibernate.

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

И так, если кратко, то решить быстро это проблему можно так:
в директории, где находится eclipse или eclipse.exe (для Windows) нужно найти файл eclipse.ini и открыть в текстовом редакторе, в котором нужно добавить/отредактировать следующие строки:
-Xms512m
-Xmx512m
-XX:PermSize=512m
-XX:MaxPermSize=512m

Это пример моих настроек. Настраивайте параметры в зависимости от объема памяти на вашем компьютере. Кратко об этих параметрах:
Xms - это минимальный объем выделяемой памяти (кучи - heap)
Xmx - это максимальный объем выделяемой памяти (кучи - heap)
XX:PermSize - это начальный размер permanent generation (о нем подробней позже...). Он создается в дополнение к объему Xms.
XX:MaxPermSize - максимальный размер permanent generation.

Теперь осталось запустить eclipse c ключем -clean
eclipse -clean
(Примечание: начиная с версии 3.4 (GANYMEDE) запускать -clean не нужно)

НО! Все-таки нужно убедиться что эти параметры задействованы. Дело в том, что на некоторых Unix* ОС настройки файла eclipse.ini не срабатывают, даже если описаны правильно.
Для того, чтобы убедиться изменения в настройках можно просмотреть:
Help -> About Eclipse Platform -> Configuration details
и смотрим строку eclipse.vmargs=

Чтобы окончательно победить проблему есть 2 способа:

1-й способ. Window -> Preferences -> Java -> Installed JREs -> выбор нашего JRE -> Edit и в строке Default VM Arguments пишем
-vmargs -Xms512m -Xmx512m -XX:PermSize=512m -XX:MaxPermSize=512m

2-й способ. Написать скрипт запуска eclipse. Например, в создать файл eclipse.sh, дать права на запуск () и прописать в файле:
#!/bin/bash

eclipse -vmargs -Xms512m -Xmx512m -XX:PermSize=512m -XX:MaxPermSize=512m

Надеюсь, этот баг больше возникать не будет ;)
О дополнительных способах борьбы с этой проблемой можно почитать в этой статье

PS Доп. материал:

MaxPermSize and how it relates to the overall heap

Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine

Frequently Asked Questions about Garbage Collection in the HotspotTM JavaTM Virtual Machine

Java Performance Documentation

Tuning Java Virtual Machines (JVMs)

Memory Analyzer (MAT)