拯救 Out Of Memory,8个案例带你飞!

1. Java 堆空间

发生频率:5颗星

造成原因

  1. 无法在 Java 堆中分配对象
  2. 吞吐量增加
  3. 应用程序无意中保存了对象引用,对象无法被 GC 回收
  4. 应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。finalizer 由结束队列服务的守护线程调用,有时 finalizer 线程的处理能力无法跟上结束队列的增长

解决方案

单位对应:GB -> G, g;MB -> M, m;KB -> K, k

  1. 使用 -Xmx 增加堆大小
  2. 修复应用程序中的内存泄漏

2. GC 开销超过限制

发生频率:5颗星

造成原因

  1. Java 进程98%的时间在进行垃圾回收,恢复了不到2%的堆空间,最后连续5个(编译时常量)垃圾回收一直如此。

解决方案

  1. 使用 -Xmx 增加堆大小
  2. 使用 -XX:-UseGCOverheadLimit 取消 GC 开销限制
  3. 修复应用程序中的内存泄漏

3. 请求的数组大小超过虚拟机限制

发生频率:2颗星

造成原因

  1. 应用程序试图分配一个超过堆大小的数组

解决方案

  1. 使用 -Xmx 增加堆大小
  2. 修复应用程序中分配巨大数组的 bug

4. Perm gen 空间

发生频率:3颗星

造成原因

Perm gen 空间包含:

  • 类的名字、字段、方法
  • 与类相关的对象数组和类型数组
  • JIT 编译器优化

当 Perm gen 空间用尽时,将抛出异常。

解决方案

  1. 使用 -XX: MaxPermSize 增加 Permgen 大小
  2. 不重启应用部署应用程序可能会导致此问题。重启 JVM 解决

5. Metaspace

发生频率:3颗星

造成原因

  1. Java 8 开始 Perm gen 改成了 Metaspace,在本机内存中分配 class 元数据(称为 metaspace)。如果 metaspace 耗尽,则抛出异常

解决方案

  1. 通过命令行设置 -XX: MaxMetaSpaceSize 增加 metaspace 大小
  2. 取消 -XX: maxmetsspacedize
  3. 减小 Java 堆大小,为 MetaSpace 提供更多的可用空间
  4. 为服务器分配更多的内存
  5. 可能是应用程序 bug,修复 bug

6. 无法新建本机线程

发生频率:5颗星

造成原因

  1. 内存不足,无法创建新线程。由于线程在本机内存中创建,报告这个错误表明本机内存空间不足

解决方案

  1. 为机器分配更多的内存
  2. 减少 Java 堆空间
  3. 修复应用程序中的线程泄漏。
  4. 增加操作系统级别的限制
    • ulimit -a
    • 用户进程数增大 (-u) 1800
  5. 使用 -Xss 减小线程堆栈大小

7. 杀死进程或子进程

发生频率:1颗星

造成原因

  1. 内核任务:内存不足结束器,在可用内存极低的情况下会杀死进程

解决方案

  1. 将进程迁移到不同的机器上
  2. 给机器增加更多内存

与其他 OOM 错误不同,这是由操作系统而非 JVM 触发的。

8. 发生 stack_trace_with_native_method

发生频率:1颗星

造成原因

  1. 本机方法(native method)分配失败
  2. 打印的堆栈跟踪信息,最顶层的帧是本机方法

解决方案

  1. 使用操作系统本地工具进行诊断

本文分享自微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-21

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏原创

个推基于Zipkin的分布式链路追踪实践 顶

随着微服务架构的流行,系统变得越来越复杂,单体的系统被拆成很多个模块,各个模块通过轻量级的通信协议进行通讯,相互协作,共同实现系统功能。

15530
来自专栏爱写Bug

Leetcode加一 (java、python3)

Given a non-empty array of digits representing a non-negative integer, plus one ...

10820
来自专栏Java研发军团

聊聊数据库乐观锁和悲观锁

在写入数据库的时候需要有锁,比如同时写入数据库的时候会出现丢数据,那么就需要锁机制。

16630
来自专栏纯洁的微笑

面试中的 ThreadLocal 原理和使用场景

相信大家不管是在网上做题还是在面试中都经常被问过 ThreadLocal 的原理和用法,虽然一直知道这个东西的存在但是一直没有好好的研究一下原理,没有自己的知识...

14020
来自专栏Linyb极客之路

面试难点:你了解乐观锁和悲观锁吗?

乐观锁和悲观锁问题,是出现频率比较高的面试题。本文将由浅入深,逐步介绍它们的基本概念、实现方式(含实例)、适用场景,以及可能遇到的面试官追问,希望能够帮助你打动...

15330
来自专栏Java研发军团

老司机教你用原生JDK 撸一个 MVC 框架!!!

其实 Spring MVC 是一个基于请求驱动的 Web 框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器进行处理,具体工作...

12650
来自专栏码匠的流水账

聊聊Elasticsearch的ConcurrentMapLong

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/concurren...

10600
来自专栏码匠的流水账

聊聊Elasticsearch的RoundRobinSupplier

elasticsearch-7.0.1/libs/nio/src/main/java/org/elasticsearch/nio/RoundRobinSuppl...

13430
来自专栏C语言入门到精通

特别推荐 | Java图书系列

大多数人选择Java可能只是听说了Java前景好、Java好找工作、Java语言在TIOBE排行榜上一直位于前三等等之类的原因,但是Java具体好在哪里呢?

16220
来自专栏Spring相关

Linux使用Shell脚本部署jar包项目

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151....

88330

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励