jvm:内存泄漏,和我一起用几行代码来写一个内存泄漏的案例

java比较牛逼的地方就是垃圾回收机制,不用想C++那样需要手动管理内存,那么java自动管理内存,为啥还会出现内存泄漏嘞?

jvm:内存泄漏,和我一起用几行代码来写一个内存泄漏的案例

如何界定一个对象是否可以被回收?两种方法,引用计数法,可达性分析法。

引用计数法:每个对象有一个引用计数属性,新增一个该对象的引用时,计数+1,该对象的引用释放时,计数-1,当计数为0时,说明可以回收。但是引用计数法无法解决相互引用问题,因为相互引用时计数为1,永远无法被回收。

可达性分析法:从GC Roots开始向下搜索,所走过的路径称为引用连,当一个对象到GC Roots没有任何引用链时,虚拟机判断其为可回收对象。该方法可以解决循环引用问题。

内存泄漏:

内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。也就是,有可能此对象已经不使用了,但是还有其它对象保持着此对象的引用,就会导致 GC 不能回收此对象,这种情况下就会出现内存泄漏。

来个内存泄漏的例子:

//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。

//如果对象加入到 Vector 后,还必须从 Vector 中删除,最简单的方法就是将 Vector 对象设置为 null。

int times = 10;
Vector vertor = new Vector<>(times);
LongStream.rangeClosed(0, times).boxed().forEach(n -> {
 Object o = new Object();
 vertor.add(o);
 o = null;
});

循环申请 Object 对象,并将所申请的对象放入一个 Vector 中,如果我们仅仅释放引用本身,那么 Vector 仍然引用该对象,所以这个对象对 GC 来说是不可回收的。

jvm:内存泄漏,和我一起用几行代码来写一个内存泄漏的案例

最后总结下:

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

所以内存泄漏可能会导致内存溢出,但内存溢出并不完全都是因为内存泄漏,也有可能使用了太多的大对象导致。

jvm:内存泄漏,和我一起用几行代码来写一个内存泄漏的案例


分享到:


相關文章: