记一道面试题:手写一个内存泄漏的代码,如何修正

前几天面试的时候被问到手写一个内存泄漏的代码,并且如何修正,当时有点蒙,后来面试官写了三行代码,如下

1         Object obj1=new Object();
2         Object obj2=new Object();
3         obj1=obj2;

试分析是否出现内存泄漏,为什么,

首先,先了解一下内存泄漏是什么?百度百科给了一个答案

简单的说就是我们已经不需要的对象,它没有被清理,依旧存在堆内存中.但是项目一旦运行又不会时长终止,那么这个对象就会一直存在,占用空间也会进行累计.

上面的代码是存在内存泄漏的,这里将obj2的对象赋值给obj1,但是obj2依然引用着原来的地址值,而且obj2已经不用了,这时候obj2就引起了内存泄漏,

解决方法也很简单,只需要将obj2=null;就可以被gc回收

这里面有涉及到一个强引用的概念

  强引用:常见的普通对象引用,只要还有强引用指向一个对象,就表示这个对象还"活着",lajihu垃圾回收不会回收这种对象.对于一个普通对象,如果没有其它引用欢喜,只要超过了引用的作用域或者显示地将对应(强)引用赋值为null,就可以被垃圾收集了。

  软引用:SoftReference,相对于强应用弱一些,可以让对象豁免一些垃圾收集,只有当JVM认为内存不足时,才会去试图回收软引用指向的对象。JVM会确保在抛出OutofMemoryError之前,清理软引用指向的对象。这样保证了使用缓存的同时,不会耗尽内存。

  弱引用:并不能使对象豁免垃圾收集,仅仅是提供一种访问在弱引用状态下对象的途径。如果试图获取时对象还在,就使用它,否则重新实例化,他同样是很多缓存实现的选择。

  幻象引用:也叫虚引用,你不能通过它访问对象。仅仅提供了对象被finalize之后,做某些事情的机制,比如Post-Mortem清理机制

 

  对象可达性状态流转图:

 

所有引用类型,都是抽象类java.lang.ref.Reference的子类,提供了get()fangfa。

除了幻象引用(get返回null),如果对象没有被销毁,都可以通过get()方法获取原有对象,我们可以将访问到的对象,重新指向强引用没也就是人为该百年对象的可达性状态。

posted @ 2019-06-30 16:28  陌上金丸看落羽  阅读(657)  评论(1编辑  收藏  举报