Я имел дело с проблемами памяти в своем приложении и считаю, что наконец-то прибил его с помощью профилирования с помощью Yourkit - я кеширую пользователя в сеансе, но каждый кэшируемый User
составляет 2 МБ, что создает много памяти при входе пользователей в систему и сохранении их сеансов:
Пользователи занимают 50% ОЗУ
Каждый пользовательский объект занимает 2 МБ, некоторые занимают 8 МБ
Когда я расширяю каждый класс, похоже, что вся память занята ассоциацией authorities
, которая определяет роли пользователя: Расширенный класс в Yourkit
Вот XML Hibernate для соответствующих классов:
Пользователь:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.pps.domain" default-lazy="false">
<class name="User" table="pps_users">
<cache usage="read-write"/>
<comment>User</comment>
<id name="id" type="long">
<generator class="native">
</generator>
</id>
<set name="authorities" inverse="true" table="pps_user_roles" lazy="true">
<cache usage="read-write"/>
<comment>User - Roles Associations</comment>
<key column="user_id"/>
<many-to-many column="role_id" class="com.pps.domain.Role"/>
</set>
</class>
</hibernate-mapping>
Роль:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.pps.domain" default-lazy="false">
<class name="Role" table="pps_roles" lazy="true">
<cache usage="read-write"/>
<comment>Role</comment>
<id name="id" type="long">
<generator class="native">
</generator>
</id>
<property name="description"/>
<property name="authority"/>
<set name="users" table="pps_user_roles" lazy="false">
<cache usage="read-write"/>
<comment>User - Roles Associations</comment>
<key column="role_id"/>
<many-to-many column="user_id" class="com.pps.domain.User"/>
</set>
</class>
</hibernate-mapping>
Я полагал, что, поскольку таблица ролей кэширует пользователей (а в системе более 10 000 пользователей), результатом этого стал раздутый класс User
, но удаление <cache usage="read-write"/>
не помогло. Я не знаю слишком много о Hibernate, поэтому я не уверен, где я иду не так. Есть предложения?
Примечание: проект находится в Grails 1.3.7, и я использую (устарел) плагин acegi
, если это помогает.
РЕДАКТИРОВАТЬ:
Я удалил обе ссылки на cache
в наборе authorities
, а также в Role
. Объект на самом деле стал больше. Кроме того, в YourKit количество объектов для каждого пользователя составляет 10 900, что находится в пределах нескольких фактических пользователей в системе, поэтому он все равно должен их каким-то образом кэшировать. Мне нужно, чтобы это не было правдой!