【发布时间】:2011-11-18 07:12:15
【问题描述】:
我一直在处理我的应用程序中的内存问题,并相信我终于通过使用 Yourkit 进行分析来解决这个问题 - 我在会话中缓存用户,但每个被缓存的 User 是 2MB,这会创建一个整体用户登录并保存会话时的大量内存:
Users are taking up 50% of RAM
Each User Object is 2MB, some taking 8MB
当我展开每个类时,似乎所有内存都被与authorities 的关联所占用,它定义了用户的角色:Expanded Class In Yourkit
以下是相关类的 Hibernate XML:
用户:
<?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>
我认为,由于 Roles 表正在缓存用户(系统中有超过 10,000 个用户),因此导致 User 类膨胀,但删除 <cache usage="read-write"/> 并没有帮助。我对Hibernate不太了解,所以我不确定我哪里出错了。有什么建议吗?
注意:该项目位于 Grails 1.3.7 中,如果有帮助,我正在使用(已弃用)acegi 插件。
编辑:
我删除了authorities 集合和Role 中对cache 的引用。物体实际上变大了。此外,在 YourKit 中,每个用户的对象计数为 10,900,这在系统中的少数实际用户之内,因此它仍然必须以某种方式缓存它们。我需要这不是真的!
【问题讨论】:
-
如果你只是从两个类中删除所有缓存,只是为了看看你的内存是如何受到影响的,会发生什么?
-
@Mac - 不知何故,每个加载的实例内存会跳到 10MB,这没有任何意义。
标签: hibernate caching memory grails spring-security