解析@Transactional时内存使用率很高

时间:2014-02-04 10:58:53

标签: java spring hibernate memory

我正在分析我的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的屏幕截图:

enter image description here

你看到的撞击是由这个电话引起的。现在,如果单个控制器方法对事务服务方法有多次调用,则会累积到大约100MB内存使用量的颠簸。这可能是垃圾收集,因此它不是内存泄漏,但我很好奇可能导致此问题的原因,以及它是否是正常行为。这仅在第一次调用事务方法时发生。成功调用几乎不会占用内存。

编辑:这是内存崩溃后的堆转储: enter image description here

EDIT2:这是另一个screencap,有些内存被一些ZipFileInflaterInputStream中的Finalizer对象吃掉(我不使用它!) enter image description here

1 个答案:

答案 0 :(得分:0)

很抱歉我无法发表评论,我没有足够的代表,但是猜测一下,我会说Hibernate正在创建ZipFileInputStream来处理,解压缩并创建被发回的对象为每个字段创建一个Finalizer实例的数据库(可能)。我猜这个文件会被压缩用于传输,尽管如果不使用LocalSessionFactory就不会发生这种情况很有意思。除了直觉之外,我没有证据证明这一点,但它可能会在某个地方引导。