记一道面试题:手写一个内存泄漏的代码,如何修正
Posted lingzhigege
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一道面试题:手写一个内存泄漏的代码,如何修正相关的知识,希望对你有一定的参考价值。
前几天面试的时候被问到手写一个内存泄漏的代码,并且如何修正,当时有点蒙,后来面试官写了三行代码,如下
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()方法获取原有对象,我们可以将访问到的对象,重新指向强引用没也就是人为该百年对象的可达性状态。
以上是关于记一道面试题:手写一个内存泄漏的代码,如何修正的主要内容,如果未能解决你的问题,请参考以下文章