`
getthrough
  • 浏览: 9383 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java内存泄漏

    博客分类:
  • Java
阅读更多

Java内存泄漏

  • 什么是内存泄漏?

        内存泄漏指的是存在“不再使用但持有引用”的对象,它们无法被GC回收,占用了内存的现象。轻微的内存泄漏不容易被察觉,严重的内存泄漏容易导致OOM(out of memory)。

 

  • 哪些操作可能导致内存泄漏?
  1. 使用静态集合或数组而没有及时使用清除指向对象的引用导致;
  2. 使用 Set 集合保存对象,当修改对象属性后,无法通过该对象删除导致;
  3. 没有及时释放资源连接(IO连接,数据库连接,Socket网络连接等)导致,应在 finally 块中释放资源;
  4. 外部类持有内部类的引用没有及时清除;
  5. 模块之间方法调用,在参数中传递了对象引用,如果在被调用的模块方法中又将该引用赋值给了另一个引用,那么对于该传递的对象(堆上的对象)而言,需要同时清除多个引用才能被回收;
  6. 单例对象中如果持有其他对象的引用,那么该引用无法被清除;
  7. 使用 GUI API 编程时,使用到的各种监听器,是比较容易被忽略释放的;Java Web 编程中,监听器同样会被使用,但总体来说,数量有限。

Case 1

Static List<Object> list = new ArrayList<>(100);
for (int i = 1; i < 100; i ++) {
    Object o = new Object();
    list.add(o);
    o = null;// 只清除了创建时指向该对象的引用,而集合中仍然持有该对象引用
}

 

Case 2

// 以下这段代码基于 Person 对象重写了 hashCode() 方法
// 因为 HashSet 集合的删除是基于 Map 的,Set 集合中的对象在 Map 中
// 作为 key,而 Map(数组 + 链表)中 key 所在的数组的索引是根据 key 
// 的 hashCode() 计算的,当改变了 Set 中的对象,再用改变后的对象去
// 删除,自然是删除不掉的。

public static void main(String[] args) {
        Set<Person> set = new HashSet<Person>();
        Person p1 = new Person("唐僧","pwd1",25);
        Person p2 = new Person("孙悟空","pwd2",26);
        Person p3 = new Person("猪八戒","pwd3",27);
        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素!
        p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变
        set.remove(p3); //此时remove不掉,造成内存泄漏
        set.add(p3); //重新添加,居然添加成功
        System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素!
}

 

其余略。

 

参考: http://blog.csdn.net/wtt945482445/article/details/52483944

 

 

 

分享到:
评论

相关推荐

    如何解决Java内存泄漏

    ### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...

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

    Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...

    java内存泄漏分析工具

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

    JAVA内存泄漏分析工具

    Java内存泄漏分析是一个关键的系统优化任务,尤其是在大型企业级应用中,长期运行的系统可能会因为内存泄漏导致性能下降甚至服务中断。"JAVA内存泄漏分析工具"正是一款用于解决此类问题的专业工具,它能帮助开发者...

    Java内存泄露_JVM监控工具介绍

    "Java内存泄露_JVM监控工具介绍" Java内存泄露是Java开发中常见的一种问题,发生内存泄露可能会导致Java应用程序崩溃或性能下降。在Java中,内存泄露的原因非常多样,例如,静态变量、循环引用、数据库连接池、...

    java内存泄漏问题追踪

    Java内存泄漏问题追踪 在Java编程中,内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,随着时间推移,系统可用内存逐渐...

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

    4. Native内存泄漏:Java应用可能使用JNI(Java Native Interface)与C/C++代码交互,若C/C++部分存在内存泄漏,也会间接导致Java内存泄漏。 解决内存泄漏的方法主要包括: 1. 使用工具监控:通过工具如VisualVM、...

    java内存泄露分析工具 eclipse3.5插件

    Java内存泄露是一个严重的问题,它可能导致程序性能下降,甚至导致应用程序崩溃。Eclipse Memory Analyzer(MAT)是一款强大的Java内存分析工具,特别适用于检测和解决内存泄露。标题提到的"java内存泄露分析工具 ...

    java 内存泄漏

    ### Java内存泄漏详解 #### JVM内存管理概览 在探讨Java内存泄漏之前,我们先简要回顾一下JVM(Java虚拟机)的基本架构及其内存管理机制。这有助于更好地理解内存泄漏的发生原因及其解决方法。 ##### 类装载子...

    java内存泄漏解决

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

    Java内存泄露检测

    Java内存泄露检测是Java开发中一个关键的议题,因为它直接影响到程序的稳定性和资源效率。内存泄露是指程序中已分配的内存无法被正确地释放,从而导致系统资源的浪费和可能导致程序性能下降甚至崩溃。 首先,理解...

    java内存泄露.pdf

    检测Java内存泄漏的方法包括使用JVM提供的工具,如VisualVM、JProfiler等,它们可以监测堆内存使用情况,定位对象生命周期,找出长时间存活但不再使用的对象。此外,还可以通过代码审查、单元测试、压力测试等手段...

    详解Java内存泄露的示例代码

    Java内存泄露的示例代码的知识点总结 Java内存泄露是指Java应用程序中由于某些原因导致的内存不能被正确释放,导致JVM OutOfMemory的错误。本文通过一个Demo来介绍ThreadLocal和ClassLoader导致内存泄露最终OutOf...

    关于Java内存泄漏的讨论

    什么是内存泄漏?造成内存泄漏的原因?如何解决内存泄漏?以及如何避免内存泄漏等。。。

    关于java内存泄漏

    ### 关于Java内存泄漏 #### 一、Java内存管理机制 Java的一大特色在于其自动化的内存管理机制,这主要依赖于垃圾收集器(Garbage Collection, GC)来自动完成对象的内存分配与回收。尽管这一特性极大地减轻了...

    java内存泄露定位与分析.pdf

    java内存泄露定位与分析

    java 内存泄露分析流程

    Java内存泄露是一个严重的问题,它可能导致系统性能下降,甚至服务崩溃。分析和解决这些问题需要深入理解Java内存模型、垃圾收集机制以及JVM优化策略。以下是对这个主题的详细阐述: 1. **Java内存模型** Java内存...

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

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

Global site tag (gtag.js) - Google Analytics