java内存泄漏

来源:互联网 发布:php serialize json 编辑:程序博客网 时间:2024/05/29 14:07

这个问题,到目前为止,我觉得自己理解的还是不深。简单说一说自己的理解。可能有很多不对的地方,欢迎大家指正。谢谢


首先内存泄漏和内存溢出是不一样的,在这里,要分清楚这两者之间的不同。

内存溢出(定义)指程序运行过程中无法申请到足够的内存而导致的一种错误。OutOfMemoryError)

我理解的内存溢出就是内存不够大了,用中文去理解溢出这个词,就是空间不够大了,装不下了就溢出了呗。我们在程序中一直不断的new对象,jvm就会为这个对象分配内存空间,内存不够用了,就溢出了,然后就报错了。当然不光是new,还有很多其他的情况发生内存溢出。

内存泄漏:

我之前一直都没有关注过这个问题,我一直以为内存泄漏在java中是不会发生的,原因是我在《java编程思想》这本书中看到了这样的一句话,在第14页上面。“java提供了被称为‘垃圾回收器’的机制,它可以自动发现对象何时不再被使用,并继而销毁它。垃圾回收器非常有用,因为它减少了所必须考虑的议题和必须编写的代码。更重要的是,垃圾回收器提供了更高层的保障,可以避免暗藏的内存泄漏问题,......”看到这里的时候,我以为java不会出现内存泄漏。直到前几天去阿里面试,被面试官问到java会不会出现内存泄漏,我回答不会,然后看到了面试官表情的变化,我觉得可能是错了,就回来继续研究。我发现还有下文。

而在《java编程思想》中25页对象作用域部分,最后一段。写到“java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。也就是说,你根本不用担心内存回收的问题。你只需要创建对象,一旦不在需要,他们就会自动消失。这样做就会消除了这类编程问题。(即内存泄漏)......”

首先java是存在内存泄漏的,在第一段话中说的是,避免暗藏的内存泄漏问题,第二段话中说的是消除这类编程问题(内存泄漏)。意思就是说,经过垃圾回收器回收之后,

不在被引用的对象已经被回收了,这部分内存可以继续使用了。就没有内存泄漏了。但是,这里只是说消除这类编程问题,意思就是消除不在被引用的对象产生的内存泄漏问

题。如果一个对象被引用,那么垃圾回收器是不会回收这部分内存了。那么当对象还被引用,而通过当前这个引用已经找不到它对应的对象了,对象所占用的内存就发生了泄

漏。

例如:修改hashset中对象的参数值,且参数是计算哈希值的字段

当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段,否则对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中删除当前对象,造成内存泄露。

我理解的内存泄漏:一个对象占据着内存,而这个对象几经没有用了,gc又不能回收它。

==================================================================================================================

很多人举这样一个例子:

Java代码  收藏代码
  1. Vector v=new Vector(10);  
  2. for (int i=1;i<100; i++){  
  3.     Object o=new Object();  
  4.     v.add(o);  
  5.     o=null;  
  6. }  

他们说:”在这个例子中,代码栈中存在Vector对象的引用v和Object对象的引用o。在For循环中,我们不断的生成新的对象,然后将其添加到Vector对象中,之后将o引用置空。问题是当o引用被置空后,如果发生GC,我们创建的Object对象是否能够被GC回收呢?答案是否定的。因为,GC在跟踪代码栈中的引用时,会发现v引用,而继续往下跟踪,就会发现v引用指向的内存空间中又存在指向Object对象的引用。也就是说尽管o引用已经被置空,但是Object对象仍然存在其他的引用,是可以被访问到的,所以GC无法将其释放掉。如果在此循环之后,Object对象对程序已经没有任何作用,那么我们就认为此Java程序发生了内存泄漏。 “

我在想一个问题,这是内存泄漏吗,为啥这是内存泄漏,Object对象在Vector用着呢啊,为啥说这部分的内存是需要回收却没有回收的呢?

他们说是无用对象,可达才会内存泄漏,我怎么觉得是有用对象,且不可达才是泄漏。

1 0
原创粉丝点击