我正在分析我的webapp(使用Spring + Hibernate)并且发现在必须将服务方法解析为事务性的时候,我会使用大量的内存。
这是从Controller调用服务方法:
User e = userService.getUser();
这就是服务中的所述方法:
@Transactional(readOnly = true)
public User getUser(Long id) throws GenericDataBaseException, InstanceNotFoundException {
User e = userDao.findById(id);
return e;
}
通过调试我的应用程序,我在方法调用(第一个代码片段)中放置一个断点,在getUser()的第一行放置另一个断点。现在只有@Transactional注释的注入和方面解析会激发30 MB的内存使用量。这是VisualVM的屏幕截图:
你看到的撞击是由这个电话引起的。现在,如果单个控制器方法对事务服务方法有多次调用,则会累积到大约100MB内存使用量的颠簸。这可能是垃圾收集,因此它不是内存泄漏,但我很好奇可能导致此问题的原因,以及它是否是正常行为。这仅在第一次调用事务方法时发生。成功调用几乎不会占用内存。
编辑:这是内存崩溃后的堆转储:
EDIT2:这是另一个screencap,有些内存被一些ZipFileInflaterInputStream中的Finalizer对象吃掉(我不使用它!)
答案 0 :(得分:0)
很抱歉我无法发表评论,我没有足够的代表,但是猜测一下,我会说Hibernate正在创建ZipFileInputStream来处理,解压缩并创建被发回的对象为每个字段创建一个Finalizer实例的数据库(可能)。我猜这个文件会被压缩用于传输,尽管如果不使用LocalSessionFactory就不会发生这种情况很有意思。除了直觉之外,我没有证据证明这一点,但它可能会在某个地方引导。