如果一个对象能用根搜索法搜索到,但是这些对象是无用的,即程序以后不会再使用这些对象。那么这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。容易引起内存泄漏的原因如下:
1) 静态集合类,例如HashMap和Vector。这些容器是静态的,由于他们的生命周期与程序一致,那么容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。
2) 各种连接,例如数据库连接、网络连接以及IO连接。在对数据库进行操作的
过程中,首先需要建立与数据库的连接,当不再使用时,需要调用close方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。否则,如果在访问数据库的过程中,对connection、statement、resultset不显示关闭,将会造成大量的对象无法被回收,从而引起内存泄漏。
3) 监听器(web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以实现监控)。比如统计在线人数,利用HttpSessionLisener,统计网站访问量等。在java语言中,往往会使用到监听器。通常一个应用中会用到多个监听器,但是在释放对象的同时往往没有相应的删除监听器,这也可能导致内存泄漏。
4) 变量不合理的作用域。一般而言,如果一个变量定义的作用范围大于其使用范围,很有可能造成内存泄漏。另一方面如果没有及时的把对象设置为null,很有可能会导致内存泄漏。
5) 单例设计模式可能会造成内存泄漏。如果在单例设计模式中,在创建单例对象的时候存在一个对A对象的引用,由于单例对象是以静态变量的方式存储,因此他在jvm整个生命周期中都存在,由于他有一个对对象A的引用,这样会导致A类的对象不能被回收。
JVM调优:1、防止内存泄露。2、线程池,解决用户响应时间长的问题。 3、连接池、4、JVM启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量:针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值。年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小。