博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一道面试题:手写一个内存泄漏的代码,如何修正
阅读量:4561 次
发布时间:2019-06-08

本文共 1006 字,大约阅读时间需要 3 分钟。

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

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

转载于:https://www.cnblogs.com/lingzhigege/p/11110272.html

你可能感兴趣的文章
债券市场在中小微企业金融服务中的作用及发展方向
查看>>
simulink生成hdl的几个理解
查看>>
python2计算cisco无线AP需要dhcp的option43
查看>>
Nginx+Tomcat实现https安全链接
查看>>
BZOJ 1093 强连通缩点+DAG拓扑DP
查看>>
设计模式 || 观察者模式
查看>>
H5视频播放器属性与API控件,以及对程序的解释
查看>>
010 异步处理Rest服务
查看>>
json.dumps python错误:'utf8' codec can't decode byte 0xe1 in position 5 解决方案
查看>>
P2505 [HAOI2012]道路
查看>>
wxs旅游增强
查看>>
HDOJ 1091
查看>>
STL排序算法
查看>>
增长率超 100%!东软数据可视化到底什么样?
查看>>
JSP表单提交中文乱码
查看>>
GoF23种设计模式之行为型模式之责任链模式
查看>>
拨号进入防盗界面
查看>>
makefile学习经验(二)----编译生成静态库文件
查看>>
python装饰器
查看>>
HDUOJ---2082
查看>>