Предупреждающее сообщение «Не удалось зарегистрировать обратный вызов уничтожения» приводит к утечкам памяти? - PullRequest
1 голос
/ 27 апреля 2010

Я в той же ситуации, что и этот старый вопрос:

ПРЕДУПРЕЖДЕНИЕ: не удалось зарегистрировать обратный вызов уничтожения

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

Мой вопрос таков: поскольку компоненты, обратный вызов уничтожения которых не может быть зарегистрирован, являются двумя компонентами персистентности, может ли это быть причиной утечки памяти?

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

Спасибо за вашу помощь ...

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Я думаю, что нет - это не должно иметь ничего общего с сеансом Hibernate. Он открывается и закрывается менеджером транзакций.

0 голосов
/ 28 апреля 2010

Хорошо, вот что я испытал вчера:

Мой тест (запущенный селеном) входит в мое приложение и загружает данные из БД, создавая, таким образом, один сеанс гибернации. Затем он выходит из системы. Это делается один раз каждые 3 минуты.

Компоненты персистентности создаются Spring следующим образом:

  <bean scope="session" 
    id="persistanceService" 
    class="com.a.b.c.PersistanceServiceImpl"
    p:entityManagerFactory-ref="entityManagerFactory" />

Фабрика менеджера сущностей настроена следующим образом:

 <bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
  p:dataSource-ref="dataSource" p:persistenceUnitName="jpa" >

  <property name="jpaVendorAdapter">
    <bean
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
      p:database="ORACLE"
      p:databasePlatform="org.hibernate.dialect.Oracle9iDialect"
      p:showSql="false"  />
  </property>
  <property name="jpaProperties">
    <props>
      <prop key="hibernate.hbm2ddl.auto">validate</prop>
    </props>
  </property>      
</bean>

Я запускал тест и создавал дамп потока каждые 30 минут, то есть каждые 10 входов / выходов из системы.

Если прослушиватель не установлен, я вижу, что экземпляры сеанса складываются каждый раз, когда я вхожу и выхожу. Время ожидания сеанса установлено на 30 минут, и в журналах я вижу, что сеанс признан недействительным, поэтому я ожидал, что число сеансов уменьшится после этого времени, но оно все еще увеличивается. Количество сессий составляло 30 после 1:30 и продолжало расти.

Если установлен прослушиватель, то количество экземпляров сеанса остается низким. На самом деле, это говорит об одном, потому что, как только тест выходит из системы, аннулирование сеанса http фактически делает недействительным сеанс гибернации, и все GC'ed. Так было последние 15 часов.

Учитывая все это, я думаю, что отсутствие этого слушателя вполне может привести к утечкам памяти ...

Божо: что ты думаешь об этом? Кстати, я не опытный пользователь SO: я должен был опубликовать это под моим вопросом? Я думал, что отвечаю на свой вопрос здесь, поэтому я добавил ответ, но не уверен: -)

...