专栏首页老男孩成长之路面试杂谈 - 内存泄漏如何排查

面试杂谈 - 内存泄漏如何排查

Java的垃圾回收机制给了程序猿便利,我们可以不需要显式释放资源。但想高枕无忧却是不能,OOM像个隐藏在暗处的幽(hua)灵(nong),威胁着可怜、弱小又漂亮的程序猿。

一般来说,一个健康的程序,它是不应该出现OOM的。内存里的对象从生到死,井然有序。但由于一些人为的失误,往往会让一些对象逃过GC的制裁,跳出GC外,不在垃圾中。这个时候,内存泄漏就发生了。

内存泄露,是指程序在申请内存并且用完这块内存后(对象不再需要了),没有释放已申请的内存空间。少数偶然的内存泄漏,虽然不太好,但问题不大,我们也不至于对那点内存抠抠搜搜的。但如果是内存不断泄漏,直到新的对象没有足够的空间生成,就会导致OOM。

什么时候可能内存泄漏

抛出OOM异常

当程序抛出OutOfMemoryError,如果你自认不是太抠,给了这个程序足够的空间,那么可以怀疑有内存泄漏

内存持续上升

一个健康的程序应该有平稳的新陈代谢,内存占用应该维持在一定范围。但如果内存持续飙升,甚至到达了一个危险的值,那么可以怀疑有内存泄漏。

查看GC情况

首先获取到应用的pid,可以使用java的jps命令,或者ps -ef|grep 应用名关键词

可以看到Eden(E)持续造对象,并且满了之后,老年代(O)增加,E区腾空后继续造对象。(程序多执行一段时间,或者造对象速度提快点,最终会抛出OOM)

查看存活对象

根据存活对象的不正常增长情况,分析程序中哪些地方用到了这种对象,也可以大致推断出可能的内存泄漏处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • G1 GC:一个神奇的 JVM 参数,减少你的内存消耗

    现代 Java 应用程序有大量的字符串操作,例如,Web 服务 API 调用(JSON、REST、SOAP 等)、外部数据源调用(SQL、从 DB 返回的数据等...

    Java_老男孩
  • Java 堆外内存回收原理

    DirectByteBuffer 这个类是 JDK 提供使用堆外内存的一种途径,当然常见的业务开发一般不会接触到,即使涉及到也可能是框架(如 Netty、RPC...

    Java_老男孩
  • 面试官,Java8中JVM内存结构变了,永久代到元空间

    在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试者,如果知晓这些变化,又将成为面试中的亮...

    Java_老男孩
  • Android | App内存优化 之 内存抖动解决实战

    点击堆转储按钮,(或者直接在图中选中一段图形) 工具会弹出刚刚选中的一段时间内, 内存分配情况的窗口, 阅读时,可以点击下侧表格中右上...

    凌川江雪
  • Java中堆的内存泄漏和内存溢出 及问题解决 参数设置

    1、内存泄漏:严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏,由于这些对象不能被垃圾收集掉,这样的对象多了,有可能就会OOM。

    一个长不胖的程序Yuan
  • 堆栈 jvm 太难懂?买房子总能理解了吧

    友情提示:本章开始可能会有部分较深入的内容,不说又不行,说了又很难解释清楚,因为里面的技术细节实在太多太复杂,所以我会屏蔽部分技术细节,只展示当前需要了解的基础...

    用户5745563
  • (必考前端测试题)关于WEB中造成内存泄漏的说法,下面错误的是?

    内存泄露是指当一块内存不再被应用程序使用的时候,由于某种原因,这块内存没有返还给操作系统或者内存池的现象。

    舒克
  • flink二三事(2):起家的技术

    上一篇聊到flink的历史,请看上篇 flink两三事 ----(1)历史。 可以说基本上是起了个大早,赶了个晚集,但是flink能做今天这种热度,没有被spa...

    大数据和云计算技术
  • Linux内存管理精华文章汇总

    Linux操作系统(包括Android)之所以可以运行丰富的应用程序,是因为背后有着内存管理和进程调度的支撑,个人觉得这两点也是所有OS的精华。掌握内存管理和进...

    刘盼
  • Android内存泄漏监控和优化技巧总结

    用户1263954

扫码关注云+社区

领取腾讯云代金券