码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-06-30 17:17:02      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:项目   为什么   技术   mic   img   百度   对象   final   常见   

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

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()方法获取原有对象,我们可以将访问到的对象,重新指向强引用没也就是人为该百年对象的可达性状态。

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

标签:项目   为什么   技术   mic   img   百度   对象   final   常见   

原文地址:https://www.cnblogs.com/lingzhigege/p/11110272.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!