java 静态变量 内存泄露_Java中的内存泄露的几种可能

Java内存泄漏引起的原因:

内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。

长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景。

造成内存泄漏的几种情况:

1、静态集合类引起内存泄漏

像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。

2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用。

3、监听器

在释放对象的时候却没有去删除这些监听器,增加了内存泄漏的机会。

4、各种连接

比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。

5、内部类和外部模块的引用

内部类的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。此外程序员还要小心外部模块不经意的引用,例如程序员A 负责A 模块,调用了B 模块的一个方法如: public void registerMsg(Object b); 这种调用就要非常小心了,传入了一个对象,很可能模块B就保持了对该对象的引用,这时候就需要注意模块B 是否提供相应的操作去除引用。

6、单例模式

不正确使用单例模式是引起内存泄漏的一个常见问题,单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,导致内存泄漏。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java内存泄漏是指程序的对象占用了内存空间,但在使用完毕后没有正确释放,导致这部分内存无法被垃圾回收器回收,进而造成内存泄漏问题。 常见的Java内存泄漏问题有以下几种情况: 1. 长生命周期对象持有短生命周期对象的引用:当一个长生命周期对象持有一个短生命周期对象的引用,并且长生命周期对象的生命周期比短生命周期对象长时,如果没有手动解除引用,短生命周期对象将无法被回收,导致内存泄漏。 2. 集合类未及时清空:在使用集合类时,如果没有及时清空或者手动删除元素,集合的对象将一直存在于内存,无法被回收。 3. 资源未关闭:在使用IO流、数据库连接、网络连接等资源时,如果没有及时关闭这些资源,会导致资源无法释放,从而造成内存泄漏。 4. 静态引用导致的内存泄漏静态变量存在于整个应用程序的生命周期,如果静态变量引用了其他对象,并且没有手动解除引用,那么这些对象将一直存在于内存,无法被回收。 为了避免内存泄漏问题,可以采取以下几种措施: 1. 及时释放对象引用:在使用完对象后,尽量手动解除引用,让垃圾回收器能够回收不再使用的对象。 2. 使用弱引用或软引用:对于一些生命周期较长的对象,可以考虑使用弱引用或软引用来引用,这样当内存不足时,垃圾回收器会优先回收这些对象。 3. 使用try-with-resources语句块:在使用IO流、数据库连接等资源时,可以使用try-with-resources语句块来自动关闭资源,确保资源得到及时释放。 4. 使用合适的集合类:在使用集合类时,尽量使用合适的集合类,并在不需要时及时清空或手动删除元素,避免集合对象无法被回收。 通过以上措施,可以有效地避免Java内存泄漏问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值