A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 原满 中级黑马   /  2013-5-3 11:19  /  1402 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 原满 于 2013-5-3 12:57 编辑

java的内存回收是由jvm管理的,那么jvm在什么情况下会回收一个java对象所占用的内存?会不会出现因漏掉本该回收的内存而造成内存泄露呢?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

5 个回复

倒序浏览
   java会自动回收不在使用的的对象所占的内存。   但是有的时候还是会产生内存泄露的 比如说    ArrayList的长度是3,当我们删除了ArrayList中的某个个元素时,它的长度等于2,也就是该ArrayList认为自己只有2个元素,因此它永远也不会去访问底层数组的第3个元素。对于程序本身来说,这个对象已经变成了垃圾,但对于垃圾回收机制来说,这个对象依然可以被访问,因此不会回收它,这就产生了内存泄漏了。   其实你可以去百度一下  这个问题上面有人回答  貌似还很有很多种原因能造成内存泄露。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
记得张孝祥老师的高新技术里面有讲内存泄露的问题。般来说内存泄漏有两种情况。一种情况如在C/C++语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,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对象的引用vObject对象的引用o。在For循环中,我们不断的生成新的对象,然后将其添加到Vector对象中,之后将o引用置空。问题是当o引用被置空后,如果发生GC,我们创建的Object对象是否能够被GC回收呢?答案是否定的。因为,GC在跟踪代码栈中的引用时,会发现v引用,而继续往下跟踪,就会发现v引用指向的内存空间中又存在指向Object对象的引用。也就是说尽管o引用已经被置空,但是Object对象仍然存在其他的引用,是可以被访问到的,所以GC无法将其释放掉。如果在此循环之后,Object对象对程序已经没有任何作用,那么我们就认为此Java程序发生了内存泄漏。


回复 使用道具 举报
java中有垃圾回收机制:System.gc()即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。
垃圾回收只会回收那些引用计数为零的对象instance,当一个对象的引用计数不为零或者处于可以追溯状态时,垃圾回收器永远都不会回收这些堆内存,常见JVM内存泄漏都是由这个原因引起的。
回复 使用道具 举报
jvm的回收也不是固定的,要看JVM的版本还有所使用的回收算法,以及对数据的定义,已经数据的生存情况(新生代,老生代),建议看书,比较长
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马