我一直在处理应用程序中的内存问题,并相信我最终通过对Yourkit进行分析来解决了这个问题-我在 session 中缓存了User,但是缓存的每个User
都是2MB,这会在用户创建大量内存登录并保存其 session :
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表正在缓存Users(系统中有10,000多名用户),因此膨胀的
User
类是这样做的结果,但是删除<cache usage="read-write"/>
并没有帮助。我对Hibernate不太了解,所以我不确定哪里出了问题。有什么建议么?注意:该项目位于Grails 1.3.7中,如果有帮助,我正在使用(不建议使用)
acegi
插件。编辑:
我删除了
cache
集合以及authorities
中对Role
的引用。对象实际上变大了。同样,在YourKit中,每个用户的对象计数为10,900,这在系统中的实际用户数之内,因此仍然必须以某种方式对其进行缓存。我需要这不是真的!
最佳答案
与其关闭缓存,不如将缓存配置为允许更少的对象并且不永远缓存它们,这听起来好像在做。有关Hibernate如何使用缓存以及如何命名缓存区域的详细信息,请参见"The Second Level Cache",因此您知道如何更改正确的缓存设置。
编辑:再次考虑,基于您的评论,Hibernate缓存不是您的问题。您要描述的不是Hibernate中的缓存如何工作。缓存角色的事实并不意味着也缓存了所有用户。每种类型的对象都是独立缓存的。您需要查看除Hibernate二级缓存之外的其他地方。加载角色会导致1万名用户加载,这一事实可能就是问题所在。你不要那样您可能想看看"extra-lazy" collection fetching。另外,请检查Yourkit,以查看究竟是什么保留了对这些内容的引用(如果有)。
关于hibernate - hibernate 缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438417/