内存泄露 hibernate优化 web程序优化 session优化(一)

大家好,我是hacker507,是一个IT行业的菜鸟级新手,由于今天的程序遇到了点错误,所以稍微研究了下系统优化这个概念,经过与朋友一起研究,最终的结果也起到了一定的作用;
一下未研究的内容,如果有错误的地方,请高手及时纠正,再次感谢

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();两个方法



Sql语句优化:
   研究了一半,下次再给大家供上,希望大家能纠正我的错误哈


你可能感兴趣的:(jvm,sql,Hibernate,Web,配置管理)