`

java 容易引起内存泄漏的几大原因

    博客分类:
  • java
阅读更多
容易引起内存泄漏的几大原因

1 静态集合类
     像HashMap、Vector 等静态集合类的使用最容易引起内存泄漏,因为这些静态变量的生命周期与应用程序一致,如示例1,如果该Vector 是静态的,那么它将一直存在,而其中所有的Object对象也不能被释放,因为它们也将一直被该Vector 引用着。

2 监听器
     在java 编程中,我们都需要和监听器打交道,通常一个应用当中会用到很多监听器,我们会调用一个控件的诸如addXXXListener()等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。

3 物理连接
         一些物理连接,比如数据库连接和网络连接,除非其显式的关闭了连接,否则是不会自动被GC 回收的。Java 数据库连接一般用DataSource.getConnection()来创建,当不再使用时必须用Close()方法来释放,因为这些连接是独立于JVM的。对于Resultset 和Statement 对象可以不进行显式回收,但Connection 一定要显式回收,因为Connection 在任何时候都无法自动回收,而Connection一旦回收,Resultset 和Statement 对象就会立即为NULL。但是如果使用连接池,情况就不一样了,除了要显式地关闭连接,还必须显式地关闭Resultset Statement 对象(关闭其中一个,另外一个也会关闭),否则就会造成大量的Statement 对象无法释放,从而引起内存泄漏。


4 内部类和外部模块等的引用
        内部类的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。对于程序员而言,自己的程序很清楚,如果发现内存泄漏,自己对这些对象的引用可以很快定位并解决,但是现在的应用软件并非一个人实现,模块化的思想在现代软件中非常明显,所以程序员要小心外部模块不经意的引用,例如程序员A 负责A 模块,调用了B 模块的一个方法如:

public void registerMsg(Object b);
这种调用就要非常小心了,传入了一个对象,很可能模块B就保持了对该对象的引用,这时候就需要注意模块B 是否提供相应的操作去除引用。
分享到:
评论

相关推荐

    Java加载dll,导致Java进程内存泄露

    如果DLL中分配了内存但未正确释放,或者Java和DLL之间对对象的引用处理不当,都可能导致内存泄露,使得Java进程的内存占用持续增长,影响系统性能。 描述中的“NULL”可能是博主在描述问题时的简化表示,通常在编程...

    如何解决Java内存泄漏

    然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视无效对象的释放时,可能会导致内存泄漏问题。在实际项目中,内存泄漏不仅会影响系统的性能,还可能导致系统不稳定。因此,了解Java内存泄漏的成因、...

    java内存泄露、溢出检查方法和工具

    这可能是由于内存泄露、大对象的频繁创建、堆设置不合理等原因导致。解决内存溢出问题通常需要调整JVM的内存参数,如`-Xms`和`-Xmx`用于设置堆的初始大小和最大大小,以及`-XX:MaxPermSize`(对于较旧的JVM版本)或`...

    java内存泄漏分析工具

    Java内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。为了有效地诊断和解决这类问题,开发者需要借助特定的分析工具。本篇将详细探讨Java内存泄漏及其相关的分析工具。 内存泄漏是指...

    java之内存泄露

    1. **静态集合类的使用**:像`HashMap`、`Vector`这样的静态集合类,由于其生命周期与应用程序一致,很容易导致内存泄露。一旦对象被添加至这些集合中,除非显式删除,否则这些对象将一直被保留,无法被GC回收。 2...

    java内存泄漏解决

    ### Java内存泄漏解决方案详解 #### 一、Java内存泄漏概述 在Java开发过程中,经常会遇到内存泄漏的问题,尤其是在长时间运行的应用程序中更为常见。本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地...

    java内存泄漏问题追踪

    - 本地方法栈内存泄漏:Java Native Interface (JNI) 使用的本地方法可能会占用C/C++堆内存,如未释放,可能导致内存泄漏。 2. 内存泄漏的检测: - Java VisualVM:这是JDK自带的工具,可以进行内存快照分析,...

    java 内存泄漏

    - **静态集合类**:如果在一个静态集合类中保存了对象的引用,而这个静态集合类又没有提供清理机制,则可能导致内存泄漏。 - **监听器**:注册的监听器如果没有及时移除,可能会导致对象无法被垃圾回收。 - **日志...

    Java内存泄露及内存无法回收解决方案

    内存泄漏通常发生在堆内存中,当程序创建对象并分配内存后,如果不再需要这些对象,但程序并没有正确地释放它们,就可能导致内存泄漏。这种情况下,即使垃圾收集器(Garbage Collector, GC)也无法识别出这些对象...

    java避免内存泄露

    然而,在实际应用中,仍然存在一些特殊情况会导致内存泄露的发生。 #### 二、内存泄露的原因分析 1. **未及时关闭资源**:例如文件句柄、数据库连接等,如果不主动关闭,即使不再使用,也会占用系统资源。 2. **...

    JAVA内存泄漏分析工具

    2. ** Leak Suspects**:MAT会自动分析并列出可能导致内存泄漏的嫌疑对象和引用链,这是查找内存泄漏的快速入口。 3. **支配树分析**:通过支配树可以清晰地看到对象间的引用关系,帮助确定哪些对象无法被垃圾回收。...

    java使用JMAP定位代码内存泄漏在哪

    1. **Leak Suspects Report**:MAT会识别出最可能导致内存泄漏的候选对象和引用链。 2. **Dominator Tree**:这个视图显示了对象之间的支配关系,帮助我们找出占用内存最大的对象。 3. **Top Consumers**:列出...

    java内存分析-内存泄露问题.rar

    4. **定位代码问题**:根据引用链回溯到代码,找出导致内存泄漏的代码片段,可能是因为资源未关闭、静态集合类中添加了大量对象等原因。 5. **修复并验证**:修改代码,消除内存泄露,并重新运行程序验证是否解决...

    基于Java的内存泄露分析及定位

    比如,当一个大对象被一个全局变量引用,即使该对象不再被程序其他部分使用,由于引用依然存在,垃圾收集器不会回收它,从而可能导致内存耗尽。 Java的垃圾收集算法有多种,如引用计数算法、标记-清除算法、标记-...

    关于java内存泄漏

    4. **ThreadLocal变量**:ThreadLocal中保存了对对象的强引用,如果线程长时间存活,而这些对象又不再被使用,则会导致内存泄漏。 #### 四、Java内存泄漏的检测与避免 ##### 检测方法: 1. **工具辅助**:使用...

    Java系统中内存泄漏测试方法的研究

    3. 异常处理:捕获异常时创建的对象如果未正确释放,可能会导致内存泄漏。 4. ThreadLocal:如果线程局部变量未被正确清理,可能会导致内存泄漏。 5. 注册监听器未取消:注册的监听器如果没有在适当的时候解除注册,...

    关于JAVA内存泄漏问题注意事项

    Java内存泄漏问题是一个重要的主题,尤其对于大型的J2EE应用程序而言,理解并避免内存泄漏至关重要。虽然Java的垃圾收集机制能自动管理内存,但并不意味着程序员可以完全忽视内存管理。以下是一些关于Java内存泄漏的...

Global site tag (gtag.js) - Google Analytics