`
peacockbird
  • 浏览: 4977 次
  • 性别: Icon_minigender_2
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java的内存泄露问题

    博客分类:
  • java
阅读更多
今天在读java的ArrayList 的源码的时候对该方法里面的动作

 public E remove(int index) {
 RangeCheck(index);

 modCount++;
 E oldValue = elementData[index];

 int numMoved = size - index - 1;
 if (numMoved > 0)
     System.arraycopy(elementData, index+1, elementData, index,
        numMoved);
 elementData[--size] = null; // Let gc do its work

 return oldValue;
    }

 elementData[--size] = null; // Let gc do its work 百思不得其解,不明白为什么要做这样一个动作,有什么意义。无意见拿起手边的effective java这本书 ,原来这句代码是消除过期的对象的引用!!防止发生outofmemoryerror ,把这章看完,感觉仍然很模糊,为什么垃圾回收器不回收这些引用?什么时候一个类自己管理自己的内存?或者什么叫做一个类自己管理自己的内存?看书上的解释,似乎有数组的情况下,有可能发生这样的事情,那么有没有其他的存在情况呢?

还有就是作者所说的缓存也有可能存在这种情况,也很是茫然。

分享到:
评论
17 楼 bloodrate 2008-07-28  
jvm只负责管理对象,可不负责管理引用,你不把它设置成null,你自己知道这个我不用了,别人可不知道这个你不用了,null等于你告诉他“不用”的一个信号
16 楼 realeasy 2007-09-27  
peacockbird 写道
呵呵,谢谢。但是我有个疑问jvm是怎么知道什么时候这些引用是我们自己在管理的?

有一种jvm他是这样找的(忘记哪种了,汗一个),他会在gc发生的时候便利所有栈上的引用,只要有引用的,他就顺藤摸瓜,摸下去,如果是对象就便利对象的引用,摸呀摸呀,只要被他摸到的,都是安全的,都不会被删除。而且清理的时候也有两种情况,一种是较小的内存释放,就直接释放了,另一种是较多的释放,他会拷贝内存到另一个连续的区域,因为java 的new方法分配的内存是连续的,这也是为啥比c++的new快的原因。
大体上就这样,具体jvm实现不同。
15 楼 pikachu 2007-09-27  
realorg 写道
怎么知道那些内存算是垃圾内存呢?

对象是从main函数开始创建的,所有对象之间的关系会形成一张图,不在图里的就是再也用不到的垃圾了。

14 楼 timerri 2007-09-27  
所谓弱引用,就是雇个机器人自动去断开钩子而已~~它可不是狗实现的....

GC的实现方法。建议楼上的去查查资料。搞清楚了你估计就会改变对GC的看法。
13 楼 realorg 2007-09-27  
听说,Java中有一个弱引用类的哦~!

那么也就是说,即使外界没有任何引用指向堆内存对象时,GC自身也会有一个弱引用指向这些对象。本来Java 中的引用就是C++中的指针,如果GC本身没有弱引用的话,怎么知道那些内存算是垃圾内存呢?就像C++中的delete()方法一样,需要一个指针变量作为参数。

说老实话,虽然垃圾回收可以让程序员变得更懒惰,但是我个人真的很讨厌它的。因为不知道什么时候才能释放掉你可能马上就想利用的内存。

12 楼 peacockbird 2007-09-27  
非常感谢各位的帮助
11 楼 pikachu 2007-09-27  
peacockbird 写道
或者说我们什么时候去消除对象的过期引用?

因为函数内的局部变量出函数就会丢失引用,所以,只有类的成员变量是可能被长期持有的。

静态成员变量,类初始化的时候,静态成员就会被创建,直到程序结束,所以可能会造成内存泄漏。特别是集合,数组类的成员变量
实例的成员变量,如果某个实例,生命周期贯穿整个程序,那么这个实例的成员变量也可能造成内存泄漏。

其他情况下可能由于内存使用很糟糕造成内存溢出,不过如果能够增加jvm虚拟内存让程序运行过去,那么内存会被GC释放不会造成泄漏。
10 楼 dennis_zane 2007-09-27  
sum的JVM的GC,引用计数、mark and sweep、分代收集算法都用到了,对GC有兴趣可以去看《深入java虚拟机》第二版啊
9 楼 pikachu 2007-09-27  
peacockbird 写道
呵呵,谢谢。但是我有个疑问jvm是怎么知道什么时候这些引用是我们自己在管理的?


jvm不知道,所有没法掉下来的鸭子他都不管。
所以,如果,鸭子你自己死命的拽着,越拽越多,那条叫GC的狗永远刁不到。

钩子一般有两种情况会断开
1,函数内局部变量,出函数会断开
2,手工设置null
8 楼 linginfanta 2007-09-27  
二楼的,太有才了,学习。
7 楼 ray_linn 2007-09-27  
回到最早的COM,你就会看到引用计数器,这个东西,有人用就+1,有人释放就-1,数值到0就从内存中清除掉。这是垃圾收集最直接的方法---引用计数算法。

引用计数无法解决环形数据的问题,所以还得引入追踪算法。 其他的算法还有不少。
6 楼 peacockbird 2007-09-27  
或者说我们什么时候去消除对象的过期引用?
5 楼 peacockbird 2007-09-27  
呵呵,谢谢。但是我有个疑问jvm是怎么知道什么时候这些引用是我们自己在管理的?
4 楼 movingboy 2007-09-26  
二楼的比喻很形象~~~
3 楼 collin000 2007-09-26  
timerri 写道


形象点说,你可以把引用当作钩子,管理对象当作架子,被管理的对象当作鸭子,GC就是在地上跑来跑去拣掉下来鸭子的狗。
鸭子通过钩子挂在架子上,我们需要的时候随时都能从架子上找到所需要的鸭子,即便我们暂时不用,鸭子也不会被狗叼走。可是如果一只鸭子臭了,我们以后永远用不着了,那么我们就会断开钩子,鸭子就会掉在地上被狗拣跑了。



这个比喻简直太拽了, 是原创??? 最佳创意奖!!!
2 楼 wl95421 2007-09-26  
timerri 写道
java中所谓管理自己的内存,就是在对象中维护一些引用,即使外界暂时不再使用这些引用,GC也不会释放他们(因为还在被管理对象引用着)。当外界完全不再使用某引用时,管理对象应该及时的清除这个引用,否则就会造成内存泄露。

形象点说,你可以把引用当作钩子,管理对象当作架子,被管理的对象当作鸭子,GC就是在地上跑来跑去拣掉下来鸭子的狗。
鸭子通过钩子挂在架子上,我们需要的时候随时都能从架子上找到所需要的鸭子,即便我们暂时不用,鸭子也不会被狗叼走。可是如果一只鸭子臭了,我们以后永远用不着了,那么我们就会断开钩子,鸭子就会掉在地上被狗拣跑了。

也就是说,只要你自己管理了一个对象的引用,GC就不会帮你去释放,只有释放了引用,GC才会释放引用指向的对象。
解释的很明白
1 楼 timerri 2007-09-26  
java中所谓管理自己的内存,就是在对象中维护一些引用,即使外界暂时不再使用这些引用,GC也不会释放他们(因为还在被管理对象引用着)。当外界完全不再使用某引用时,管理对象应该及时的清除这个引用,否则就会造成内存泄露。

形象点说,你可以把引用当作钩子,管理对象当作架子,被管理的对象当作鸭子,GC就是在地上跑来跑去拣掉下来鸭子的狗。
鸭子通过钩子挂在架子上,我们需要的时候随时都能从架子上找到所需要的鸭子,即便我们暂时不用,鸭子也不会被狗叼走。可是如果一只鸭子臭了,我们以后永远用不着了,那么我们就会断开钩子,鸭子就会掉在地上被狗拣跑了。

也就是说,只要你自己管理了一个对象的引用,GC就不会帮你去释放,只有释放了引用,GC才会释放引用指向的对象。

相关推荐

    java内存泄漏问题追踪

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

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

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

    JAVA内存泄漏问题处理方法经验总结

    这篇博客“JAVA内存泄漏问题处理方法经验总结”分享了作者在处理此类问题时的一些实用技巧和经验,结合源码分析和工具使用,对于Java开发者来说是非常有价值的。 首先,了解内存泄漏的基本概念是至关重要的。内存...

    关于java内存泄露问题解决

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

    如何解决Java内存泄漏

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

    java内存泄漏解决

    本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地理解和应对这一挑战。 #### 二、Java内存模型与内存区域 Java虚拟机(JVM)管理着多种不同类型的内存区域,包括堆内存(Heap Memory)、方法区(Method Area)...

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

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

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

    Java内存泄露是Java开发中常见的一种问题,发生内存泄露可能会导致Java应用程序崩溃或性能下降。在Java中,内存泄露的原因非常多样,例如,静态变量、循环引用、数据库连接池、Session溢出等等。为了检测和解决Java...

    java内存泄漏分析工具

    总结来说,Java内存泄漏的分析工具如JVisualVM、MAT、JProfiler和Arthas等,提供了丰富的功能来帮助开发者定位和解决内存泄漏问题。理解这些工具的使用方法和特性,结合实际的项目经验,可以有效地防止和修复内存...

    Java内存泄漏问题相关总结

    【Java内存泄漏问题相关总结】 在Java编程中,内存泄漏是一个严重的问题,它指的是程序中已分配的内存没有被正确地释放,导致这部分内存无法被垃圾收集器(GC)回收,长时间积累会消耗大量系统资源,影响应用性能。...

    如何解决Java内存泄漏.pdf

    本文将深入讨论Java内存泄漏的解决方法,提供一些工具和技巧,帮助开发者检测和解决内存泄漏问题。 首先,需要了解什么是内存泄漏。在Java中,内存泄漏通常是指不再使用的对象占用的内存无法被垃圾回收器回收。这种...

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

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

    JAVA内存泄漏分析工具

    "JAVA内存泄漏分析工具"正是一款用于解决此类问题的专业工具,它能帮助开发者定位并修复内存相关的问题,如内存泄漏和内存溢出。 内存泄漏是程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能看似...

    内存泄漏问题\防范JAVA内存泄漏解决方案

    在Java编程中,内存泄漏是一个严重的问题,尤其对于长时间运行的应用程序,它可能...通过细心的代码审查、合理的对象管理和利用工具进行监控,我们可以有效地避免和解决Java内存泄漏问题,从而确保应用的稳定性和性能。

    Java内存泄漏问题处理方法经验总结

    Java内存泄漏问题处理方法经验总结 Java内存泄漏问题处理方法经验总结是Java开发中非常重要的一个方面,今天我们将分享关于Java内存泄漏问题处理方法经验总结的知识点。 首先,Java内存泄漏的问题描述是系统在...

    java内存泄露总结

    Java内存泄露问题是软件开发过程中常见的难题之一。通过对内存管理机制的理解及上述几种常见内存泄露场景的认识,开发者可以更好地预防和解决这类问题。为了进一步提高代码的质量,建议在开发过程中结合单元测试和...

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

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

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

    Java内存泄露的示例代码的知识点总结 Java内存泄露是指Java应用程序中由于某些原因导致的内存不能被正确释放,导致JVM ...通过正确释放资源,避免使用ThreadLocal,正确使用ClassLoader,可以避免Java内存泄露问题。

Global site tag (gtag.js) - Google Analytics