我正在尝试分析堆转储,以确定休眠缓存设置是否是原因。
有问题的对象的许多实例都由"org.hibernate.internal.util.collections.IdentityMap"引用。如何构造OQL查询来返回hibernate引用的对象实例的确切数量?
如果你运气好,你可能能够让dominatorof()
函数工作,试试这样的方法:
SELECT * FROM ".*" o WHERE classof(dominatorof(o)).@displayName.contains("class org.hibernate.internal.util.collections.IdentityMap")
但这将使MAT遍历堆中的每个对象,因此返回结果需要很长时间(假设您有一个相当大的堆)。然而,真正的问题是,我发现dominatorof()
函数不一致,所以您可能无法找到每个对象。如果您有一个类列表,那么您可能能够加快查询速度,并确认您得到了正确的支配者。例如,如果X和Y是类名,则可以使用"X|Y"作为正则表达式,而不是".*",还可以运行此查询查看结果:
SELECT dominatorof(o) FROM "X|Y" o