您的位置:首页 > 编程语言 > Java开发

java内存泄漏原因(从内存角度分析,而不是从语法角度)

2017-12-30 17:19 323 查看
昨天面试官大哥问了我JVM的垃圾回收算法,我答不上来,然后大哥说,内存泄漏是基于JVM的垃圾回收算法之上的。我当时还理解的还不太深刻,说了一串引用仍持有等等的东西来解释内存泄漏。其实不是的,我说的只是从语法层面出发的东西,正确的答案应该是,从内存的角度去分析啊。

所以感兴趣可以先看看http://blog.csdn.net/qq_36523667/article/details/78937304 JVM入门,java环境基础+理解内存+垃圾判定、回收算法

现在从内存的角度去解释内存泄漏。

内存中用户可以使用的是

程序存储区

静态存储区

动态存储区

比较容易忽视的是在动态存储区未释放内存或无法释放内存导致的内存泄漏。一句话来说就是,情况1:通过确定垃圾对象的算法(可达性算法),发现依然是可达的,所以垃圾回收器就不会回收它;情况2:可达性算法发现是不可达的,但是由于某种原因,垃圾回收器回收不了他。这就是内存泄漏的两种情况了(这是我看了JVM的垃圾搜寻 算法和垃圾回收算法个人的理解)。

产生方式

常发性内存泄漏

发生内存泄漏的代码会被多次执行到,每次发生都有一块内存泄漏

偶发性内存泄漏

某些特定情况下才会发生

一次性内存泄漏

发生内存泄漏的代码只会被执行一次

隐式内存泄漏

程序在运行的时候不断分配内存,直到结束的时候才释放内存。严格来说没有发生内存泄漏,但是这个内存释放不及时,对于服务器程序来说,会运行很久吧,到那个时候就boom了。(这是最难检测到的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: