пятница, 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)

четверг, 6 ноября 2008 г.

Как настроить Linux, чтобы просматривать Java аплеты в Firefox и Opera



Все-таки Flash на сегодня (2008 год) используется на много больше, чем Java аплеты, несмотря на то, что у аплетов больше возможностей.

Одной из главных причин есть то, что Flash не нужно устанавливать и нет проблем в настройке для обычного пользователя Innternet.
Проблема, думаю, не в сложностях технической реализации, а скорее в политике - такие IT-гиганты как Microsoft и Sun не сумели подружиться и ...
Но сейчас не об этом.

Предполагаю, что Java уже установлен. Проблем с установкой Java возникает редко и особых усилий не нужно (можно просто скачать .bin файлик с java.sun.com и запустить его)

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

Нужно просто создать символическую ссылку /usr/lib/browser-plugins/libjavaplugin.so на файл $JAVA_HOME/plugin/i386/ns7/libjavaplugin_oji.so

Пример:
cd /usr/lib/browser-plugins/
ln -s /usr/java/default/jre/plugin/i386/ns7/libjavaplugin_oji.so libjavaplugin.so

и перезагрузить браузер.
Ни в коем случае не следует копировать файл. Иначе браузер виснет при отображении аплетов

Если что-то не получается существуют еще вариаты:
Для Firefox
Необходимо создать ссылку в папке $HOME/.mozilla/plugins/ (если папки plugins нет, то нужно ее создать)
на файлик libjavaplugin_oji.so с директории $JRE_HOME/plugin/i386/ns7
Пример команды:
mkdir /home/user/.mozilla/plugins (если plugins там нет)
ln -s /usr/java/default/jre/plugin/i386/ns7/libjavaplugin_oji.so /home/user/.mozilla/plugins/libjavaplugin_oji.so

На некоторых сайтах рекомендуют еще создать переменную окружения MOZ_PLUGIN_PATH
(в основном это не обязательно).
Для этого в файлике .bash_profile нужно добавить:
MOZ_PLUGIN_PATH=$HOME/.mozilla/plugins
export MOZ_PLUGIN_PATH
Чтобы переменная окружения заработала нужно либо перелогиниться либо запустить: sh ./.bash_profile

Перезапускаем Firefox на всякий случай проверяем разрешен ли в настройках Java (Настройки-Содержание)

для Opera все намного проще:
Настройки-Дополнительно(закладка)-Содержание(в списке)-ставим галочку "включить Java", нажимаем на кнопке "Параметры Java", указываем путь к Java (у меня /usr/java/jdk1.6.0_10/jre/lib/i386), проверяем путь с помощью кнопки проверки.
Если путь является корректным, то перезапускаем Opera.

И радуемся богатством технологий Java