`
lt200819
  • 浏览: 188076 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA中的内存泄露

    博客分类:
  • JAVA
阅读更多

很长时间以前,研究过JAVA的内存泄露,正好今天找到这篇帖子,这种hashSet的泄露和经典。懒的写了,转载过来。

所谓内存泄露就是一个对象占用的一块内存,当这个对象不在被使用时,该内存还没有被收回。

例子

package cn.xy.test;

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class Point2   
{   
 private int x;   
 private int y;   
          
 public Point2(int x, int y)   
 {   
  super();   
  this.x = x;   
  this.y = y;   
 }   
          
 @Override
 public int hashCode()   
 {   
  final int prime = 31;   
  int result = 1;   
  result = prime * result + x;   
  result = prime * result + y;   
  return result;   
 }   
          
 @Override
 public boolean equals(Object obj)   
 {   
  if (this == obj) return true;   
  if (obj == null) return false;   
  if (getClass() != obj.getClass()) return false;   
  Point2 other = (Point2) obj;   
  if (x != other.x) return false;   
  if (y != other.y) return false;   
  return true;   
 }   
          
 public int getX()   
 {   
  return x;   
 }   
          
 public void setX(int x)   
 {   
  this.x = x;   
 }   
          
 public int getY()   
 {   
  return y;   
 }   
          
 public void setY(int y)   
 {   
  this.y = y;   
 }   
          
}   
          
public class HashSetAndHashCode2   
{   
 public static void main(String[] args)   
 {   
  HashSet<Point2> hs2 = new HashSet<Point2>();   
  Point2 p21 = new Point2(3, 3);   
  Point2 p22 = new Point2(3, 5);   
  hs2.add(p21);   
  hs2.add(p22);   
  p22.setY(7);   
  hs2.remove(p22);   
  System.out.println(hs2.size());   
 }   
}

很多人认为打印出的结果是1。结果是2。为什么呢?当一个对象被存储在Hashset中后,如果修改参与计算hashcode有关的字段,那么修改后的hashcode的值就与一开始存储进来的hashcode的值不同了,这样contains无法通过hashcode找到该元素,所以无法删除。这就告诉我们,当一个对象被存储在Hashset中后,不要修改与计算hashcode有关的字段。

本文出自 “IT Fat Man” 博客,请务必保留此出处http://woshixy.blog.51cto.com/5637578/1061147

分享到:
评论

相关推荐

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

    Java中内存泄露及垃圾回收机制参照 Java是一种可以编写跨平台应用软件的面向对象的程序设计语言,由Sun Microsystem公司的詹姆斯·高斯林等人于20世纪90年代初开发。伴随着Java技术的普及,网络上越来越多的服务器...

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

    ### Java中内存泄露及垃圾回收机制 #### 一、内存泄露概述 在计算机科学领域,内存泄露是指在程序运行过程中,不再使用的内存未被及时释放,导致这部分内存无法被重复利用,进而影响程序性能甚至导致程序崩溃的...

    如何解决Java内存泄漏

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

    java中内存泄漏.docx

    Java内存管理的核心是对象的生命周期,所有对象都在堆内存中分配。当一个对象不再被任何引用所指向,即成为无用对象时,理论上它应该被GC回收。GC通过建立一个有向图来跟踪对象的引用关系,其中根节点通常是程序的主...

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

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

    关于Java中内存泄露问题的研究.pdf

    关于Java中内存泄露问题的研究

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

    本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 首先,理解内存泄露的概念至关重要。在Java中,内存泄露通常发生在对象不再被程序使用但仍然保持在内存中,...

    java之内存泄露

    本文将深入探讨Java内存泄露的原因、表现形式以及预防措施。 #### 二、Java内存回收机制 Java的内存管理机制主要依赖于垃圾回收器(Garbage Collection, GC),这是一种自动化的内存管理方式。当对象不再被引用时,...

    java内存泄漏分析工具

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

    java内存泄漏解决

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

    java避免内存泄露

    在Java中,由于具备垃圾回收机制(GC),理论上开发者不必担心内存泄露问题。然而,在实际应用中,仍然存在一些特殊情况会导致内存泄露的发生。 #### 二、内存泄露的原因分析 1. **未及时关闭资源**:例如文件句柄、...

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

    Java内存管理是一个关键的议题,尤其对于开发大型和长期运行的应用程序来说,内存泄漏可能导致性能下降,甚至引发严重的系统故障。内存泄漏通常发生在程序错误地管理内存,导致某些不再使用的对象无法被垃圾收集器...

    java内存泄漏问题追踪

    4. "java内存泄露专题研究和应用_石麟.docx"可能提供了更深入的研究和实际案例,包括如何识别特定类型的内存泄漏,以及针对不同场景下的解决方案。而"ha450.jar"可能是一个示例应用或者工具,用于演示内存泄漏问题...

    JAVA内存泄漏分析工具

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

    java 内存泄漏

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

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

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

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

    本文将详细介绍如何使用JMAP工具来定位Java代码中的内存泄漏问题。 首先,理解内存泄漏的概念:内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能并不明显,但随着时间的推移,这些未...

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

    本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并提供相应的解决方案。 首先,我们要了解Java内存模型。Java虚拟机(JVM)中有三个主要的内存区域:堆内存(Heap)、栈内存(Stack)和方法区(Method...

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

    收机制在Java中,垃圾回收(Garbage Collection, GC)是一项自动管理内存的重要机制,它主要负责识别并清除不再使用的对象,从而释放内存资源。Java的垃圾回收机制是由虚拟机(JVM)的一部分——垃圾回收器(Garbage...

Global site tag (gtag.js) - Google Analytics