`

Java内存泄露实例代码

    博客分类:
  • java
阅读更多

内存泄露本质:长生命周期的对象持有了短生命周期的对象的引用。

 

减少内存泄露风险方式:

1.单例模式。 单例模式一般都是全局静态持有,所以需要注意,尽量不要在单例中持有大对象。

2.遇到大对象的时候,用完及时设为null。

3.对象尽可能的减小其生命周期。

4.I/O流用完一定要关闭。如文件流、socket流、数据库连接等

5.引用类型的数组中某个元素不再需要的时候,一定要设为null

 

 

 

下面为可能会出现内存泄露的代码:

 

1.使用HashSet集合的情况。由于set是不重复的,更新操作会先通过hashcode来查找,然后通过equels来判断是否相等。

   默认hashcode 和equels方法: 在更新类中的字段值,不会造成内存泄露

   重写hashcode 和equels方法: 重写后这两个方法一般都是随着类中的字段值hashcode也跟随着变化,在删除更新后的对象时,可能会造成内存泄露(hashcode变化,找不到该对象了)

 

public class SetMemLeak {

    private final static Set<Stock> stockSet = new HashSet<Stock>();

    public static void main(String[] args) {
        Stock stock1 = new Stock("300059.SZ", 12.5f, 13.1f);
        Stock stock2 = new Stock("600000.SH", 23.5f, 43.1f);

        int beforeHashcode = stock1.hashCode();
        stockSet.add(stock1);
        stockSet.add(stock2);
        int beforeSize = stockSet.size();
        stock1.setPclose(132.1f);   //
        int afterHashcode = stock1.hashCode();
        System.out.println("before:" + beforeHashcode + ";after:" + afterHashcode);
        //没有覆写:    before:200012267;after:200012267
        //覆写后输出:  before:1057581966;after:1086057358
        stockSet.remove(stock1);    //如果覆写equels 和hashcode方法, 这里将导致内存泄露
        int afterSize = stockSet.size();
        System.out.println("before size:" + beforeSize + ";after size:" + afterSize);
        //没有覆写:    before size:2;after size:1
        //覆写后输出:  before size:2;after size:2
    }
}

class Stock {
    private String stockCode;
    private float price;
    private float pclose;

    public Stock(String stockCode, float price, float pclose) {
        this.stockCode = stockCode;
        this.price = price;
        this.pclose = pclose;
    }

    public String getStockCode() {
        return stockCode;
    }

    public void setStockCode(String stockCode) {
        this.stockCode = stockCode;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public float getPclose() {
        return pclose;
    }

    public void setPclose(float pclose) {
        this.pclose = pclose;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Stock)) return false;

        Stock stock = (Stock) o;

        if (Float.compare(stock.pclose, pclose) != 0) return false;
        if (Float.compare(stock.price, price) != 0) return false;
        if (stockCode != null ? !stockCode.equals(stock.stockCode) : stock.stockCode != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = stockCode != null ? stockCode.hashCode() : 0;
        result = 31 * result + (price != +0.0f ? Float.floatToIntBits(price) : 0);
        result = 31 * result + (pclose != +0.0f ? Float.floatToIntBits(pclose) : 0);
        return result;
    }
}

 

 2

0
0
分享到:
评论

相关推荐

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

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

    java 内存泄露分析流程

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

    Java内存泄露检测

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

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

    本文将深入探讨Java内存分析和内存泄露问题。 首先,我们需要了解Java内存模型的基础。Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area)。堆用于存储对象实例,栈用于存储方法调用及局部...

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

    ### Java内存泄露、溢出检查方法及工具详解 #### 一、引言 在实际的项目开发和运维过程中,经常会遇到Java应用程序出现内存溢出(`java.lang.OutOfMemoryError`)的情况。这类问题不仅影响应用程序的稳定性和性能...

    java内存泄露总结

    ### Java内存泄露总结 #### 一、Java内存回收机制 Java中的内存管理主要依赖于垃圾回收(Garbage Collection, GC)机制。与C/C++等需要手动管理内存的语言不同,Java虚拟机(JVM)自动处理对象的创建与销毁过程。...

    ThreadLocal 内存泄露的实例分析1

    at 中专门为每一个 web 应用实例创建的类加载器,它负责加载该 web 应用下的所有类。当 web 应用被卸载时,WebappClassLoader 本应随之被垃圾收集器回收。然而,如果存在对 WebappClassLoader 的强引用,那么这个类...

    关于java内存泄露问题解决

    ### 关于Java内存泄露问题解决 #### 引言:Java内存管理的核心——垃圾回收机制(GC) Java作为当今产业界和学术界最炙手可热的编程语言之一,以其独特的安全性和可移植性赢得了广泛的应用,尤其是在服务器端编程...

    java内存泄露定位与分析共13页.pdf.zip

    Java内存泄露是一个严重的问题,它可能导致系统性能下降,甚至服务崩溃。本文将深入探讨Java内存泄露的定位与分析,帮助开发者更好地理解和解决这类问题。 首先,我们需要了解Java内存的几个区域:堆(Heap)、栈...

    java 内存泄露

    Java内存泄露:诊断与解决方案详解 一、Java内存泄露概览 Java内存泄露是指在Java应用程序运行过程中,已经不再使用的对象或数据结构由于某种原因未能被垃圾回收器(Garbage Collector,GC)回收,导致系统内存...

    如何解决Java内存泄漏

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

    Java内存泄露与溢出的区别.doc

    总的来说,理解Java内存泄露和溢出的区别有助于开发者编写更高效、更稳定的代码。通过合理地管理对象生命周期,避免长时间持有无用对象的引用,以及适当地配置JVM的内存参数,可以有效地防止这些问题的发生,提升...

    如何用Java编写一段代码引发内存泄露Java开发Java

    以下我们将深入探讨如何在Java中编写可能导致内存泄露的代码,以及如何避免这种情况。 1. **强引用:**在Java中,对象间的引用分为强引用、软引用、弱引用和虚引用四种。最常见的内存泄露就是由于过度使用强引用...

    内存泄露的例子

    常见的Java内存泄露场景包括: 1. 静态集合类:如ArrayList、HashMap等静态变量,它们会一直保有对对象的引用,即使对象本应被回收。 2. 长生命周期的对象持有短生命周期的对象:如线程池中的线程持有大量的对象,...

    Android处理内存泄漏的代码例子

    本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收图像、注销监听器以及释放引用。下面将详细解释这些方法。 1. 关闭游标: 在Android数据库操作中,游标是...

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

    #### Java内存泄露背景知识 **JVM内部体系结构** Java虚拟机(JVM)是Java运行环境的核心部分,它负责执行Java字节码。JVM主要由类加载器子系统、运行时数据区、执行引擎和本地接口等组成。其中,运行时数据区包括...

    Java中内存泄露及垃圾回收机制.pdf

    5. **代码审查与测试**:定期进行代码审查,利用工具进行内存泄露检测,以确保程序的健壮性。 综上所述,虽然Java的垃圾回收机制能够自动处理大部分内存管理问题,但开发者仍然需要具备一定的内存管理和优化知识,...

    提高Java开发质量之内存泄露

    ### 提高Java开发质量之内存泄露 #### 一、引言 随着J2EE应用程序规模的不断增大,软件系统的稳定性成为衡量开发质量的关键指标之一。其中,“内存泄露”是导致应用不稳定的重要因素之一。内存泄露是指程序在申请...

Global site tag (gtag.js) - Google Analytics