语法上没有,因为有java垃圾收集器负责回收。但是在实际开发中,比如操作连接池、文件、Hibernate的session等,打开后一定要关闭,否则会有内存泄露。
hibernate优化 之session优化
1。 内存泄露的两种情况分析以及避免
2。 Sql语句优化注意的地方
3。 Hibernate Session的合理利用
今天给大家分析的是第一种:内存泄露的两种情况分析以及避免
大家可能经常遇到的异常如下两种:
javax.servlet.UnavailableException: PermGen space
at org.apache.struts.action.ActionServlet.init(ActionServlet.java:402)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
………………
另一种内存泄露异常
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
先说第二种异常!
第二种异常表示的是栈溢出,栈里面无法容纳其他信息!
解决的方法,要及时的清空session,大家也可以调整session栈所占的大小
Session.Clear(),可以有效的解决上述问题 ,尤其是在不断分页循环的时候
如果是查找大量数据库,则需要调整配置文件,把栈的范围扩大,同时要给查找的列上加上索引!
第二种
PermGen space 这种,应该是大家最头痛的一个内存泄露的异常了,一般的新手,也经常遇到,要是优化,大家应该了解java的内存回收机制:
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能,在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。
优化:
1. 添加的所有对象,在事物提交之后,设置为NULL;
2. Hibernate的session的获取,是线程跟踪获取session,如果添加一个提交事物之后,运行session.clear();则会造成session清空,其他任何地方如果获取数据,都是从数据库里面重新查找(个人验证看法);
3. 执行列表显示时,不能清空session.Clear();否则造成每次list显示,都会查找数据库,会增加数据库访问负载!
4. 执行列表时,则在request.setAttribute(“”,””);之后,请设置为null,这时你可以启用垃圾回收器,调用方法:System.gc();
5. 如需在有列表显示的添加数据内容的时候,需要自己定义session,方可进行session.clear();
6. Session.flush(); 是强制与数据库同步,在提交之前,commit之前,就会自动调用session.flush();
7. 如下request.setAttribute("page", page);
8. 请大家了解 session.load() session.get();两个方法