Hibernate 中匿名对象的内存占用
Memory footprint of anonymous objects in Hibernate
我目前正在开发一个使用 Struts 和 Hibernate 构建的项目。
项目中所有DAOclasses都有如下代码
内部构造函数:
hibernateSession = HibernateUtil.currentSession();
tx=hibernateSession.beginTransaction();
所有方法的finally子句内:
HibernateUtil.closeSession();
这实际上意味着,在我的业务代码中,每次我想从数据库访问数据时,我都必须初始化引用变量或创建一个匿名对象,即
如果我必须访问 class A
的 method1
和 method2
:
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
现在我的问题是:
匿名对象是否在使用后立即被垃圾回收?在我的项目中,由于每次访问 DAO class 中的方法都是通过匿名对象进行的,它会对内存占用产生不利影响吗?如果是,还有其他方法吗?
我做的对还是有更好的方法?
这是best/correct使用Hibernate的实现方式吗?
我对 new A();
的术语 "anonymous object" 的用法正确吗?在 Google 中搜索相同内容时,我注意到许多评论说这在 Java 中不称为匿名对象,但也遇到一些将其解释为匿名对象的文章。
没有匿名对象这样的东西。你可以有匿名 类 个实例,但在你的情况下我认为你的意思是 "local variables"。 GC使用高度优化的短期对象收集策略,因此即使在商用硬件上也不会有内存问题。
有更好的方法。使用 Spring transaction management support 您可以从应用程序代码中删除事务处理例程,这样您的业务逻辑就可以只关注与业务相关的功能。
Transient entities and detached objects是常见的做法,所以不用担心。
该词不正确。局部变量或瞬态对象是一个更具描述性的术语。
1) 是的,他们有资格进行垃圾回收。在现代 JVM 中,这不会对垃圾收集器性能产生任何重大影响,因为此类对象将直接从 Eden space 中清除。
2) 还有更好的方法——依赖注入(DI, IoC),例如Spring DI.
3) 不,这不是实现它的最佳方式,因为除了有很多容易出错的样板代码之外,您将为每个 DAO 方法调用使用不同的事务。在许多用例中,您希望在单个事务中对相同或不同 DAO 上的多个方法调用进行分组。更好的替代方法是使用为此目的设计的框架在服务层以声明方式划分事务。一个例子是 Spring transaction management.
4) Java 中没有正式的术语(老实说,对我来说这样命名是有意义的)。在 java 世界中,我们简单地将其称为无参数(默认)A
构造函数的调用。
我目前正在开发一个使用 Struts 和 Hibernate 构建的项目。
项目中所有DAOclasses都有如下代码
内部构造函数:
hibernateSession = HibernateUtil.currentSession();
tx=hibernateSession.beginTransaction();
所有方法的finally子句内:
HibernateUtil.closeSession();
这实际上意味着,在我的业务代码中,每次我想从数据库访问数据时,我都必须初始化引用变量或创建一个匿名对象,即
如果我必须访问 class A
的 method1
和 method2
:
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
现在我的问题是:
匿名对象是否在使用后立即被垃圾回收?在我的项目中,由于每次访问 DAO class 中的方法都是通过匿名对象进行的,它会对内存占用产生不利影响吗?如果是,还有其他方法吗?
我做的对还是有更好的方法?
这是best/correct使用Hibernate的实现方式吗?
我对
new A();
的术语 "anonymous object" 的用法正确吗?在 Google 中搜索相同内容时,我注意到许多评论说这在 Java 中不称为匿名对象,但也遇到一些将其解释为匿名对象的文章。
没有匿名对象这样的东西。你可以有匿名 类 个实例,但在你的情况下我认为你的意思是 "local variables"。 GC使用高度优化的短期对象收集策略,因此即使在商用硬件上也不会有内存问题。
有更好的方法。使用 Spring transaction management support 您可以从应用程序代码中删除事务处理例程,这样您的业务逻辑就可以只关注与业务相关的功能。
Transient entities and detached objects是常见的做法,所以不用担心。
该词不正确。局部变量或瞬态对象是一个更具描述性的术语。
1) 是的,他们有资格进行垃圾回收。在现代 JVM 中,这不会对垃圾收集器性能产生任何重大影响,因为此类对象将直接从 Eden space 中清除。
2) 还有更好的方法——依赖注入(DI, IoC),例如Spring DI.
3) 不,这不是实现它的最佳方式,因为除了有很多容易出错的样板代码之外,您将为每个 DAO 方法调用使用不同的事务。在许多用例中,您希望在单个事务中对相同或不同 DAO 上的多个方法调用进行分组。更好的替代方法是使用为此目的设计的框架在服务层以声明方式划分事务。一个例子是 Spring transaction management.
4) Java 中没有正式的术语(老实说,对我来说这样命名是有意义的)。在 java 世界中,我们简单地将其称为无参数(默认)A
构造函数的调用。