JVM内存泄漏

如果一个对象能用根搜索法搜索到,但是这些对象是无用的,即程序以后不会再使用这些对象。那么这些对象就可以判定为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来调整二者之间的大小。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值