纳尼,Java 存在内存泄泄泄泄泄泄漏吗?

  • 时间:
  • 浏览:1

01. 咋整 回事?

纳尼,Java 都是自动管理内存吗?咋整 原因会冒出内存泄泄泄泄泄泄漏!

Java 最牛逼的一一个多多多形态学 就是垃圾回收机制,不要 像 C++ 前要手动管理内存,有些有些作为 Java 守护进程员很幸福,只管 New New New 即可,反正 Java 会自动回收过期的对象。。。

这么 Java 都自动管理内存了,那咋整 会冒出内存泄漏,难道 Jvm 有 bug? 不要 急,且听我慢慢道来。。

02. 咋整 判断要能被回收

先了解一下 Jvm 是咋整 判断一一个多多多对象要能被回收。一般有并都是办法,并都是是引用计数法,并都是是可达性分析。

引用计数法:每个对象有一一个多多多引用计数属性,新增一一个多多多引用时计数加1,引用释放时计数减1,计数为0时要能回收。

你什儿 办法看起来挺简单的,有些 原因冒出 A 引用了 B,B 又引用了 A,这并且就算当当当我们都 都是再使用了,但原因相互引用 计算器=1 永远无法被回收。

此办法简单,无法处里对象相互循环引用的难题。

可达性分析(Reachability Analysis):从 GC Roots 现在并且刚现在开始向下搜索,搜索所走过的路径称为引用链。当一一个多多多对象到 GC Roots 这么 任何引用链相连时,则证明此对象是不可用的,这么 虚拟机就判断是可回收对象。

可达性分析要能处里循环引用的难题。

这么 gc roots 对象是哪此呢

  • 虚拟机栈中引用的对象
  • 办法区中类静态属性引用的对象
  • 办法区中常量引用的对象
  • 本地办法栈中JNI[即一般说的Native]引用的对象

目前主流的虚拟机中大多使用可达性分析的办法来判定对象不是可被 GC 回收。

03. 哪此情况表下会冒出内存泄漏

既然可达性分析好像原因很牛逼的样子了,咋整 原因都是冒出内存泄漏呢,曾经们再来看一下内存泄漏的定义。

内存泄露就是指一一个多多多不再被守护进程使用的对象或变量时不时 被趋于稳定在内存中。

有原因此对象原因不使用了,有些 还有其它对象保持着此对象的引用,就会原因 GC 这么 回收此对象,你什儿 情况表下就会冒出内存泄漏。

写一一个多多多守护进程让冒出内存泄漏

①长生命周期的对象持有短生命周期对象的引用就很原因趋于稳定内存泄露,尽管短生命周期对象原因不再前要,有些 原因长生命周期对象持有它的引用而原因这么 被回收。

public class Simple {
    Object object;
    public void method1(){
        object = new Object();
        //...有些代码
    }
}

这里的 object 实例,真是当当当我们都 期望它只作用于 method1() 办法中,且有些地方不要 再用到它,有些 ,当method1()办法执行完成后,object 对象所分配的内存不要 马上被认为是要能被释放的对象,这么 在 Simple 类创建的对象被释放后才会被释放,严格的说,这就是并都是内存泄露。

处里办法就是将 object 作为 method1() 办法中的局部变量。

public class Simple {
    Object object;
    public void method1(){
        object = new Object();
        //...有些代码
        object = null;
    }
}

当然当当当我们都 有原因会想就你什儿 一个多多多办法就是会有多大影响,但原因在有些项目中,一一个多多多办法在一分钟之内调用上万次的并且,就会冒出很明显的内存泄漏难题。

②集合中的内存泄漏,比如 HashMap、ArrayList 等,哪此对象时不时 会趋于稳定内存泄露。比如当它们被声明为静态对象时,它们的生命周期会跟应用守护进程的生命周期一样长,很容易造成内存趋于稳定问题。

下面给出了一一个多多多关于集合内存泄露的例子。

Vector v=new Vector(10);
for (int i=1;i<400; i++)
{
    Object o=new Object();
    v.add(o);
    o=null;
}
//此时,所有的Object对象都这么

被释放,原因变量v引用哪此对象。

在你什儿 例子中,当当当我们都 循环申请 Object 对象,并将所申请的对象倒入一一个多多多 Vector 中,原因当当当我们都 仅仅释放引用并都是,这么 Vector 仍然引用该对象,有些有些你什儿 对象对 GC 来说是不可回收的。

有些 ,原因对象加入到 Vector 后,还前要从 Vector 中删除,最简单的办法就是将 Vector 对象设置为 null。

以上并都是是最常见的内存泄漏案例。当然还有有些内存泄漏的例子,这里就不再一一例举了,感兴趣的同学要能在网上找找资料。

04. 内存泄漏和内存溢出

有些有些同学时不时 搞不清楚,内存泄漏和内存溢出的区别,它俩是一个多多多完整不同的概念, 它们之间趋于稳定有些关联。

内存溢出 out of memory,是指守护进程在申请内存时,这么 足够的内存空间供其使用,冒出 out of memory;

内存泄露 memory leak,是指守护进程在申请内存后,无法释放已申请的内存空间,一次内存泄露危害要能忽略,但内存泄露堆积后果很严重,无论哪几条内存,迟早会被占光。

有些有些内存泄漏原因会原因内存溢出,但内存溢出不要 完有些有些有些有些原因内存泄漏,都原因使用了不要 的大对象原因。

05. 怎么才能 才能 检测内存泄漏

最后一一个多多多重要的难题,就是怎么才能 才能 检测 Java 的内存泄漏。目前,当当当我们都 通常使用有些工具来检查 Java 守护进程的内存泄漏难题。

市场上已有几种专业检查 Java 内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测 Java 守护进程运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员将根据哪此信息判断守护进程不是有内存泄漏难题。

哪此工具包括 Plumbr 、Eclipse Memory Analyzer、JProbe Profiler、JVisualVM 等。

06. 最后

以上内容真是是我曾经时不时 面试的内容之一,通过一系列的难题考察 Java 守护进程员对 Jvm 的理解。

比如我通常会问面试者,Java 中趋于稳定内存泄漏吗?大每项人都是回答趋于稳定,接着我会问原因让你写一一个多多多守护进程让内存泄漏,让你咋整 写?大每项守护进程员就回答不上来了。

原因面试者要能回答顶端的难题,我会接着和面试者聊聊,内存泄漏和内存溢出当当当我们都 之间不是趋于稳定联系 、以及在日常工作中怎么才能 才能 处里写出内存泄漏的代码 、原因生产冒出 Jvm 相关难题时,排查难题的思路和步骤等等。

哪此难题在我的博客中都是答案,早些年写了一系列关于 Jvm 的文章,当当当我们都 原因感兴趣语录接下来继续去阅读,http://www.ityouknow.com/java.html。

原因当当当我们都 真是在手机上看着更方便,要能关注:Java 极客技术公号,原因输出了有些 JVM 文章,我博客中的 Jvm 系列文章也都是推送到你什儿 公号中。

关注一下又不要 怀孕

参考出处:

https://lovoedu.gitee.io/javablog/2017/08/27/20170827/

https://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/index.html