内存泄漏和内存溢出是什么?应该如何解决呢?

110 阅读2分钟

内存溢出

内存溢出 out of memory : 程序在申请内存时,没有足够的空间供其使用。

  • 堆溢出: java.lang.OutOfMemoryError: Java heap space

    • 出现原因:

      • 大对象分配
      • 内存泄漏堆积
    • 解决方法:

      • 检查是否存在大对象分配
      • 检查内存泄漏的情况
      • 增大堆内存 -Xmx
  • 永久代/元空间溢出:java.lang.OutOfMemoryError: PermGen spacejava.lang.OutOfMemoryError: Metaspace

    • 永久代是hotspot虚拟机对方法区的具体实现,存放了被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等。JDK8后,元空间替换了永久代,元空间使用本地内存。

    • 出现原因:

      • java7之前,频繁使用String.intern()
      • 运行期间产生大量代理类,导致方法区无法卸载
    • 解决方法:

      • 检查是否永久代空间或元空间过小
      • 检查代码中是否大量反射操作

内存泄漏

内存泄漏:memory leak,程序在申请内存后,无法释放已申请的内存。内存泄漏堆积后的后果就是内存溢出。

  • 长生命周期对象持有短生命周期对象。由于长生命周期对象的静态特性使其生命周期和应用的生命周期一样长,导致对象引用的其他对象在应用结束之前不能被释放。如容器类对象、单例对象、内部类对象引用外部类对象
  • 各种连接没有被即使释放,如数据库连接、网络连接、io连接
  • 变量不合理的作用域。变量的定义作用范围大于适用范围。
  • 缓存泄漏。
  • 监听器和其他回调没有被及时取消。
  • 对象存入hashset集合后,对对象的哈希值字段进行修改。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情