注意session.clear()的运用,尤其在不断分页循环的时候。
a)在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象。
hibernate里面有一个缓存,是session级的缓存。一张表里面存了上百万的商品信息,我们要取出这些内容并且进行分页,点击下一页查看商品信息,现在假设在同一个session里面执行这个操作,这时候就会有问题。session先取50条进来,然后再开一个session,上一个session就会被清除,被清的过程是由java虚拟机的垃圾清除器来完成,什么时候清除不确定,你可以用手动来清除,利用session.clear()。
如果你只使用一个session来处理的话,当取50条信息的时候,接着再读的时候就会不断增加,在内存里面的信息就会越来越多,而且你不去清除它,由于有引用的存在,java虚拟机是不会帮你清除的。内存就会越占越多,内存就会爆掉。
实际开发中,我们每一个页面是单独起的一个session,这个就无所谓了。
但是你在导数据或用数据的时候,用到hibernate了,就可能出现这种错误。
应该怎么做呢?就是处理完50条之后,调用session.clear(),之后再调再取。
b)另外一种形式的内存泄露/面试题:Java有内存泄露吗?
Java有没有内存泄露?在语法级别上没有,因为不用回收内存,会被垃圾回收器回收了,但是你写程序的时候用到了其中的资源的时候,一定要记得回收。比如说你打开了数据库的连接池,打开了连接,你一定要记得关闭,不然的话他就在内存里老开着。比如说你打开了文件,你必须把他关闭,因为不关闭的话就无法调用本地的资源来关闭文件。因为打开文件相当于调了C,C调了windows的API,那么windows的API里面C调用的那部分对于C语言来说是需要手动回收内存的,如果不关闭文件它就不会回收。所以是Java引起的泄露,但是语法上不是(在实际当中利用的时候会有)。
a)在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象。
hibernate里面有一个缓存,是session级的缓存。一张表里面存了上百万的商品信息,我们要取出这些内容并且进行分页,点击下一页查看商品信息,现在假设在同一个session里面执行这个操作,这时候就会有问题。session先取50条进来,然后再开一个session,上一个session就会被清除,被清的过程是由java虚拟机的垃圾清除器来完成,什么时候清除不确定,你可以用手动来清除,利用session.clear()。
如果你只使用一个session来处理的话,当取50条信息的时候,接着再读的时候就会不断增加,在内存里面的信息就会越来越多,而且你不去清除它,由于有引用的存在,java虚拟机是不会帮你清除的。内存就会越占越多,内存就会爆掉。
实际开发中,我们每一个页面是单独起的一个session,这个就无所谓了。
但是你在导数据或用数据的时候,用到hibernate了,就可能出现这种错误。
应该怎么做呢?就是处理完50条之后,调用session.clear(),之后再调再取。
b)另外一种形式的内存泄露/面试题:Java有内存泄露吗?
Java有没有内存泄露?在语法级别上没有,因为不用回收内存,会被垃圾回收器回收了,但是你写程序的时候用到了其中的资源的时候,一定要记得回收。比如说你打开了数据库的连接池,打开了连接,你一定要记得关闭,不然的话他就在内存里老开着。比如说你打开了文件,你必须把他关闭,因为不关闭的话就无法调用本地的资源来关闭文件。因为打开文件相当于调了C,C调了windows的API,那么windows的API里面C调用的那部分对于C语言来说是需要手动回收内存的,如果不关闭文件它就不会回收。所以是Java引起的泄露,但是语法上不是(在实际当中利用的时候会有)。
转载请注明出处:http://blog.csdn.net/acmman/article/details/43937659