powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat регулярно выдает ошибку java.lang.OutOfMemoryError: PermGen space
1 сообщений из 26, страница 2 из 2
Tomcat регулярно выдает ошибку java.lang.OutOfMemoryError: PermGen space
    #38394663
Viktor Grafskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обещал - отписываюсь :-)

Как и сказал уважаемый Blazkowicz, источником утечек памяти оказался JDBC. К сожалению, за прошедшее время мне не удалось выявить конкретный ресурс или поток который удерживает класс-лоадер. Я несколько раз перечитал статью "забыл ник" про утечки памяти ( http://java.jiderhamn.se/2012/03/04/classloader-leaks-vi-this-means-war-leak-prevention-library/ ), но не смог обнаружить корень проблемы, думаю банально не хватает опыта.

В итоге я плюнул и создал JNDI DataSource в конфигурации tomcat'а, после этого ошибка PermGen исчезла сама собой. Также, я убрал ключи запуска -XX:PermSize=256m -XX:MaxPermSize=256m из конфигурации сервера за ненадобностью.

Мне осталось непонятным почему на сайте eclipse'а - http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#JNDI_Datasource_Setup_-_not_recommended , использование JNDI Datasource'а не рекомендовано к использованию, вместо этого, если я правильно понял, они советуют определять datasource непосредственно в persistent unit. Следуя рекомендациям eclipse'а - получаем утечки при редеплоях.

Также я приведу два примера конфигурации источника данных, быть может кому пригодится.
Конфигурация источника данных через Persistence Unit приводит к утечке памяти при редеплое приложения:
persistence.xml (leads to memory leaks)
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
     <persistence-unit name="rso-pu" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>rso.model.Entry</class>
        <class>rso.model.Tag</class>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="javax.persistence.jdbc.url" 
                value="jdbc:mysql://127.0.0.1:3306/rso?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8"/>
            <property name="javax.persistence.jdbc.password" value="topsecret"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="rso"/>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
    </persistence-unit>
</persistence>


Конфигурация источника данных через JNDI каталог, не приводит к вышеописанным проблемам:
$TOMCAT_ROOT/conf/server.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
    </GlobalNamingResources>
         ......
        <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
            maxActive="20" maxIdle="10" maxWait="-1" name="jdbc/rso-ds" password="topsecret" type="javax.sql.DataSource"
            url="jdbc:mysql://127.0.0.1:3306/rso?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8"
            username="root"/>
    </GlobalNamingResources>

$PROJECT_ROOT/META-INF/context.xml
Код: xml
1.
2.
3.
4.
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/rso" >
    <ResourceLink global="jdbc/rso-ds" name="jdbc/rso-ds" type="javax.sql.DataSource" />
</Context>

persistence.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="rso-global-pu" transaction-type="RESOURCE_LOCAL">
      <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
      <class>rso.model.Entry</class>
      <class>rso.model.Tag</class>
      <exclude-unlisted-classes>false</exclude-unlisted-classes>
      <non-jta-data-source>java:comp/env/jdbc/rso-ds</non-jta-data-source>
      <properties>
        <property name="eclipselink.ddl-generation" value="create-tables"/>
      </properties>
    </persistence-unit>
</persistence>

...
Рейтинг: 0 / 0
1 сообщений из 26, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat регулярно выдает ошибку java.lang.OutOfMemoryError: PermGen space
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]