javaVM虽然有自己的垃圾回收器,可以回收大部分的内存空间,但还是有部分的内存空间是回收不了的.
内存中饿对象分为3种:
1.无用的对象,但是不可达,这是C或C++中的内存泄露;
2.无用的对象,也可达,这就是java中的内存泄露;
3.有用的对象.这就不是内存泄露了.
为什么java中也会存在内存泄露呢,什么情况下会出现这种情况,下面是一个比较普遍的例子:
当集合或者数组(本质上是栈)加入了很多数据后,又将这些数据删除,集合或数组仍然会保留着一些信息来记录它们,所以导致GC不会把它们删除,这就是导致内存泄露的原因.
解决方案就是:
一般内存泄露是很难发现的,所以它很可能长久地存在于系统中,而没有被发现,但可以通过工具来发现它,比如bea的JRocket,IBM的Purify等等,都不错.
内存中饿对象分为3种:
1.无用的对象,但是不可达,这是C或C++中的内存泄露;
2.无用的对象,也可达,这就是java中的内存泄露;
3.有用的对象.这就不是内存泄露了.
为什么java中也会存在内存泄露呢,什么情况下会出现这种情况,下面是一个比较普遍的例子:
List list = new ArrayList();
for (int i = 0; i < 1000; i++) {
list.add(i);
}
for (int i = 0; i < 1000; i++) {
list.remove(i);
}
当集合或者数组(本质上是栈)加入了很多数据后,又将这些数据删除,集合或数组仍然会保留着一些信息来记录它们,所以导致GC不会把它们删除,这就是导致内存泄露的原因.
解决方案就是:
list.get[i]=null
一般内存泄露是很难发现的,所以它很可能长久地存在于系统中,而没有被发现,但可以通过工具来发现它,比如bea的JRocket,IBM的Purify等等,都不错.