您的位置:首页 > 职场人生

轻松搞定JAVA面试之Java 中会存在内存泄漏吗

2017-05-08 15:01 274 查看
在魔都奋斗的程序员GG 2017-05-06 13:33

前言--大家好,很快又到周末了,周末对于我们这种IT宅男来说,就是宅着陪电脑,所以今天继续为大家带来一篇JAVA面试文章,希望大家多多转发、收藏、评论、关注本头条号,你们的支持是我持续写作的动力,谢谢。

今天我们要探讨的面试题是:Java 中会存在内存泄漏吗 ?

我们知道Java内部有一个垃圾回收机制(GC),不像C++(开辟了内存空间还得手动释放),所以理论上java应该不会造成内存泄漏了吧?但是当我们实际做项目开发的时候,就会经常遇到内存泄漏的问题。可能会存在没有用处但是还存在在内存空间的对象,这些对象不能被GC回收,所以这些对象的堆积也会使得内存造成泄漏。比如像hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。

我们来看一个实例:



上面的代码主要实现的是栈的结构(FILO先进后出),当我们使用它的时候编译测试都能通过,似乎没有什么问题。然而其中的pop方法却存在内存泄露的问题,因为栈内部维护着对这些对象的过期引用(obsolete reference),当我们用pop方法把栈中的对象弹出时,这个对象不能被当作垃圾回收,即使调用这个栈的程序不再引用这些对象。在JAVA中,内存泄露有着很强的隐蔽性,这种内存泄露其实就是无意识的对象保持。如果这样存在被无意识的保持了的对象,那么这个对象中存在的引用的其他的对象也会被无意识保持,垃圾回收器就不会回收这些对象了。当这样的对象越积越多,就很容易造成内存泄漏。

欢迎大神们在评论区进行点评,提出不足和改进之处,我只是起到抛砖引玉的作用!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: