【问题标题】:Memory footprint of anonymous objects in HibernateHibernate 中匿名对象的内存占用
【发布时间】:2018-01-05 02:55:56
【问题描述】:

我目前正在开发一个使用 Struts 和 Hibernate 构建的项目。

项目中所有的DAO类都有如下代码

内部构造函数:

hibernateSession = HibernateUtil.currentSession();      
tx=hibernateSession.beginTransaction();

在所有方法的 finally 子句中:

HibernateUtil.closeSession();

这实际上意味着,在我的业务代码中,每次我想访问数据库中的数据时,我都必须初始化引用变量或创建一个匿名对象,即

如果我必须访问method1method2class A

A a= new A();

a.method1(); // access method 1 

a = new A();  
a.method2(); //access method 2

I now mostly use anonymous objects to get this done ie

new A().method1(); //access method 1
new A().method2(); //access method 2 

现在我的问题是:

  1. 匿名对象在使用后是否会被垃圾回收?在我的项目中,由于对 DAO 类中方法的每次访问都是通过匿名对象进行的,它会对内存占用产生不利影响吗?如果是的话,还有其他方法吗?

  2. 我这样做是正确的还是有更好的方法?

  3. 这是使用 Hibernate 实现的最佳/正确方法吗?

  4. 我对@9​​87654327@ 的“匿名对象”一词的用法正确吗?在 Google 中搜索时,我注意到许多 cmets 说这在 Java 中不称为匿名对象,但也看到一些文章将其解释为匿名对象。

【问题讨论】:

    标签: java hibernate anonymous-class


    【解决方案1】:
    1. 没有匿名对象这样的东西。您可以拥有匿名类实例,但在您的情况下,我认为您的意思是“局部变量”。 GC 使用高度优化的短期对象收集策略,因此即使在商用硬件上也不会出现内存问题。

    2. 有更好的方法。使用Spring transaction management support,您可以从应用程序代码中删除事务处理例程,这样您的业务逻辑就可以只关注与业务相关的功能。

    3. Transient entities and detached objects 是常见的做法,所以不用担心。

    4. 该术语不正确。局部变量或瞬态对象是一个更具描述性的术语。

    【讨论】:

      【解决方案2】:

      1) 是的,它们有资格进行垃圾收集。在现代 JVM 中,这不会对垃圾收集器的性能产生任何重大影响,因为此类对象将直接从 Eden 空间中清除。

      2)还有一种更好的方式——依赖注入(DI、IoC),例如Spring DI

      3) 不,这不是实现它的最佳方式,因为除了有很多容易出错的样板代码之外,您将为每个 DAO 方法调用使用不同的事务。在许多用例中,您希望在单个事务中对相同或不同 DAO 上的多个方法调用进行分组。更好的选择是使用为此目的设计的框架在服务层以声明方式划分事务。一个例子是Spring transaction management

      4) 在 Java 中对此没有正式的术语(老实说,对我来说这样命名是有意义的)。在 Java 世界中,我们简单地将其称为无参数(默认)A 的构造函数的调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        • 1970-01-01
        • 2022-11-05
        相关资源
        最近更新 更多