黑马程序员技术交流社区
标题:
关于java的内存回收
[打印本页]
作者:
原满
时间:
2013-5-3 11:19
标题:
关于java的内存回收
本帖最后由 原满 于 2013-5-3 12:57 编辑
java的内存回收是由jvm管理的,那么jvm在什么情况下会回收一个java对象所占用的内存?会不会出现因漏掉本该回收的内存而造成内存泄露呢?
作者:
花开花落总相似
时间:
2013-5-3 12:15
java会自动回收不在使用的的对象所占的内存。 但是有的时候还是会产生内存泄露的 比如说 ArrayList的长度是3,当我们删除了ArrayList中的某个个元素时,它的长度等于2,也就是该ArrayList认为自己只有2个元素,因此它永远也不会去访问底层数组的第3个元素。对于程序本身来说,这个对象已经变成了垃圾,但对于垃圾回收机制来说,这个对象依然可以被访问,因此不会回收它,这就产生了内存泄漏了。 其实你可以去百度一下 这个问题上面有人回答 貌似还很有很多种原因能造成内存泄露。
作者:
赵崇友
时间:
2013-5-3 12:20
记得张孝祥老师的高新技术里面有讲内存泄露的问题。般来说内存泄漏有两种情况。一种情况如在
C/C++
语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在
Java
中已经由于垃圾回收机制的引入,得到了很好的解决。所以,
Java
中的内存泄漏,主要指的是第二种情况。
Vector v=new Vector(10);
for (int i=1;i<100; i++){
Object o=new Object();
v.add(o);
o=null;
}
复制代码
在这个例子中,代码栈中存在
Vector
对象的引用
v
和
Object
对象的引用
o
。在
For
循环中,我们不断的生成新的对象,然后将其添加到
Vector
对象中,之后将
o
引用置空。问题是当
o
引用被置空后,如果发生
GC
,我们创建的
Object
对象是否能够被
GC
回收呢?答案是否定的。因为,
GC
在跟踪代码栈中的引用时,会发现
v
引用,而继续往下跟踪,就会发现
v
引用指向的内存空间中又存在指向
Object
对象的引用。也就是说尽管
o
引用已经被置空,但是
Object
对象仍然存在其他的引用,是可以被访问到的,所以
GC
无法将其释放掉。如果在此循环之后,
Object
对象对程序已经没有任何作用,那么我们就认为此
Java
程序发生了内存泄漏。
作者:
周音匀
时间:
2013-5-3 12:21
java中有垃圾回收机制:System.gc()即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。
垃圾回收只会回收那些引用计数为零的对象instance,当一个对象的引用计数不为零或者处于可以追溯状态时,垃圾回收器永远都不会回收这些堆内存,常见JVM内存泄漏都是由这个原因引起的。
作者:
刘健
时间:
2013-5-3 12:39
jvm的回收也不是固定的,要看JVM的版本还有所使用的回收算法,以及对数据的定义,已经数据的生存情况(新生代,老生代),建议看书,比较长
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2