JVM 发生 OOM 的 8 种原因、及解决办法

高手总结的9种 OOM 常见原因及解决方案

堆溢出

这种场景最为常见,报错信息:

java.lang.OutOfMemoryError: Java heap space

原因

1.代码中可能存在大对象分配(如大数组)

2.可能存在内存泄漏,多次GC后,仍然无法找到一块足够大的内存容纳当前对象

解决方法

1.对于大对象分配,条件允许的话,可以扩大堆内存的分配空间,是否可以对大对象进行分割

2.对于内存泄漏,可以使用(jmap和jconsole监测),检查代码,通过 jmap 命令 dump 内存对象

内存泄漏:指对象没有被引用也没有被回收

永久代/元空间溢出

原因

1、在Java7之前,频繁的错误使用String.intern()方法

2、类class信息太多

解决方法

1.增加永久代空间

2、重启JVM

3、jmap dump内存对象检查

jmap-dump:format=b,file=dump.hprof

4.看看程序是否存在大量反射操作

方法区,永久代,元空间的一些知识

JVM之 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别

方法区主要存储类的相关信息,常量静态变量等

JDK6、JDK7 时,方法区 就是 PermGen(永久代)。
JDK8 时,方法区就是 Metaspace(元空间)

Metaspace(元空间)和 PermGen(永久代)类似,都是对 JVM规范中方法区的一种落地实现。(hotspot)不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存

为什么要删除永久代

永久代的大小很难确定,太小容易内存溢出,触发full gc,太大则容易导致老年代溢出。

元空间保存在本地内存中,元空间的最大可分配空间就是系统可用内存空间,可以避免永久代的内存溢出问题

字符串常量池存在永久代中,容易发生内存溢出和性能问题

GC执行频繁

GC overhead limit exceeded,程序大部分时间都用于GC,且回收的内存极少。当 Java 进程花费 98% 以上的时间执行 GC,但只恢复了不到 2% 的内存,且该动作连续重复了 5 次,就会抛出 java.lang.OutOfMemoryError:GC overhead limit exceeded 错误。简单地说,就是应用程序已经基本耗尽了所有可用内存, GC 也无法回收。

跟堆溢出类似

虚拟机栈溢出

StackOverflow 栈深度过深,检查程序递归代码

Unable to create new native thread

不能创建线程,一般是由于程序线程过多

解决方案

1.检查是否创建线程过多,规范使用线程,如使用线程池创建

2.升级机器配置(如果确实需要这么多线程,机器无法满足)

3.调整操作系统的线程数阈值操作

系统会限制进程允许创建的线程数,使用ulimit -u命令查看限制。

4、通过 -Xss 降低的每个线程栈大小的容量

设置单个线程占用的内存大小

5、减少堆内存大小(如果堆内存分配过大,堆内存少了,虚拟机栈内存就自然大了)

swap space溢出

java.lang.OutOfMemoryError: Out of swap space

该错误表示所有可用的虚拟内存已被耗尽(向操作系统申请内存时耗尽)。虚拟内存(Virtual Memory)由物理内存(Physical Memory)和交换空间(Swap Space)两部分组成。当运行时程序请求的虚拟内存溢出时就会报 Outof swap space? 错误。

这种情况一般是**操作系统导致的,**可能的原因有:

1.物理内存不足或交换机内存不足,增加交换区大小,检查本地程序内存占用情况

2.升级配置升级机器内存

分配超大数组

报错信息 :

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

这种情况一般是由于不合理的数组分配请求导致的,在为数组分配内存之前,JVM 会执行一项检查。要分配的数组在该平台是否可以寻址(addressable),如果不能寻址(addressable)就会抛出这个错误。

Java内存泄漏OMM相关推荐

  1. java内存泄漏笔记

    利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码) (1)jmap -dump:file=heap_file_name pid 会产生一个heap_file_name文件 (2)jhat he ...

  2. java内存泄漏总结

    内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收 ...

  3. 一次恐怖的 Java 内存泄漏排查实战

    转载自  一次恐怖的 Java 内存泄漏排查实战 最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>(第二版)这本书,理论+实践结合,深入浅出,强烈推荐给大家. 这两天对JVM内 ...

  4. Java内存泄漏介绍

    转载自 Java内存泄漏介绍 内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存.但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏. 本章会 ...

  5. java内存泄漏案例_寻找内存泄漏:一个案例研究

    java内存泄漏案例 一周前,我被要求修复一个有内存泄漏问题的webapp. 考虑到过去两年左右的时间里我已经看到并修复了数百个泄漏,我想这有多难. 但是事实证明这是一个挑战. 12小时后,我发现该应 ...

  6. java内存泄漏和内存溢出_Java和内存泄漏

    java内存泄漏和内存溢出 总览 术语"内存泄漏"在Java中的使用方式不同于在其他语言中使用的方式. 通用术语中的"内存泄漏"是什么意思,在Java中如何使用 ...

  7. 从一个OutOfMemoryError 学会了分析Java内存泄漏问题

    从一个OutOfMemoryError 学会了分析Java内存泄漏问题 以前都是好好的,最近出现了 oom. 问题 开始是: java.lang.OutOfMemoryError: Java heap ...

  8. Java内存泄漏的介绍

    Java内存泄漏的介绍 Java最重要的优势之一是它的内存管理.您只需创建对象,Java Garbage Collector负责分配和释放内存.但是,情况并不那么简单,因为Java应用程序中经常发生内 ...

  9. unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了

    原文:https://www.toptal.com/java/hunting-memory-leaks-in-java 作者:Jose Ferreirade Souza Filho 译者:Emma来源 ...

最新文章

  1. 分享一下我的JAVA自学历程,加上我觉得效果还不错的方法
  2. Spring Cloud微服务之Gateway网关(十三)
  3. 2015-10-07 jQuery2
  4. Qt-连续容器及迭代器
  5. canvas js 绘图插件_快速入门前端图表插件Echart
  6. php+mysql防注入字符串过滤_php 防sql注入过滤代码
  7. Docker 大势已去,Podman 崛起
  8. Cesium:加载本地高程/地形数据
  9. QT编译静态库与动态库
  10. ASO|几个ASO优化方案解析(下)
  11. win7系统激活工具怎么用?
  12. 数据采集:Flume和Logstash的工作原理和应用场景
  13. linux(CentOS7)服务器环境搭建之-supervisor
  14. C# 线程的挂起与唤醒 (AutoResetEvent,ManualResetEvent)
  15. snprintf_s解释
  16. 波特率9600是什么意思 串口通信为什么要设置波特率
  17. uni-app开发小程序app页面中获取globalData
  18. ubuntu18添加中文输入法
  19. 超级好用的pycharm破译教程
  20. arcgis js api和openlayer在处理大数据的表现

热门文章

  1. 如何才能选到好导师?
  2. 【产品设计】平面设计之框架简析
  3. 用gcc编译生成动态链接库*.so文件的方法
  4. bson java_使用Gobson / Mgo解组BSON数据
  5. sublime text3安装emmet插件
  6. python儿童入门教程-python儿童教程
  7. 作业论文 关于游戏Counter-Striker枪械使用的报告
  8. 等价类划分法的步骤和示例
  9. watch watch watch the video! I got almost addicted. Oh what a fuck!!!!
  10. Galera Cluster详解