您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

OOM问题,无外乎这些

时间:2023-04-14 15:50:35  来源:今日头条  作者:阿辉聊性能测试

这篇文章,我们来讲一下JVM中最常见,也是最严重的性能问题OOM。

首先,我们得知道,什么是OOM。

OOM是OutOfMemoryError的英文缩写,通俗的讲,就是内存溢出错误。上次,我们说到JVM中有GC资源回收机制,会对新生代、老年代、元空间这些内存比较大的区域进行回收,提高内存的复用率,为什么还会出现内存溢出错误呢?

说到内存溢出,我们得先说它的孪生兄弟内存泄露。JAVA程序在启动时,从内存条中申请了一段内存空间,程序在运行过程中,就把新对象丢到这段内存空间中,然后,使用GC资源回收策略,释放被占用的内存空间,这是理想中的状态。但是,在实际项目中,经常会出现一些意外情况,如某一对象进入JVM的内存空间后,生命周期特别长,长到成为了‘老赖’,虽然有GC资源回收,但是,对于老赖也无能为力,回收不了。如果,这样的‘老赖’很少,还无所谓,但是,一旦多了起来,就导致,剩余可用的内存空间越来越少,这样一种现象,就称为‘内存泄露’。如果此时程序运行过程中,有一个比较大的对象,需要一个比较大的内存空间来存放,此时,剩余的内存不足够存放这个大对象,这时,就内存溢出就出现了。

所以,内存溢出,

 

  • 有可能是代码问题,申请了过多对象驻留在内存中;
  • 也可能是申请的对象太大,大于剩余内存空间;
  • 也可能是程序申请的内存空间太小;
  • 也可能是JVM内存堆栈配置参数不合理;
  • 也可能是GC资源回收策略不合理;
  • 也可能是操作系统参数限制。

这些,是从概念的理解上,就能推断出来的可能原因,当然,实际项目,可能性会更多,但是,我们把这些先搞定,那OOM的问题就不是大问题了。

接下来,我们看下常见的OOM错误都有哪些?

 

  • java.lang.OutOfMemoryError: Java heap space

这个错误,相信大家都不陌生,错误信息中,明确提示了java堆空间。堆空间不够用了。可能是程序运行过程中,申请了很多对象放在内存中,这些对象又都还‘活’着,不能被GC回收,导致剩余可用堆空间不够用。或者JVM配置的堆太小,程序运行过程中,堆空间不够用。

  • java.lang.OutOfMemoryError: GC overhead limit exceeded

出现这个错误,其原因是多次GC的效率非常低。内存空间不够用,通过GC来回收空间,但是,多次回收的效率非常低,几乎没有效果,所以,就报了这个错误,出现这个错误,一般是堆空间配置太小。

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

这个错误信息比较明确,数组对象大小超过了VM的限制,也就是说新对象太大。对于这个问题,先确认下是否是代码bug,真有必要申请这么大的对象吗?如果确认要申请大对象,那就调大JVM的堆空间大小。

  • java.lang.OutOfMemoryError: MetaSpace

提示信息中明确说了,是元空间。如果JDK低于1.8,提示的就是Permgen space永久代。永久代元空间里面存放的是类信息和常量池。一般来说,这些对象都不会特别大,所以,这个错误,比较少见。出现这个错误,我们可以调大JVM的MaxPermSize的值(JDK<1.8)或MaxMeteSpaceSize的值(JDK≥1.8)。

  • java.lang.OutOfMemoryError: Unable to create native threads

这个错误,字面意思很好理解,就是不能再创建活跃的线程了,但是,涉及的知识面却很广。

首先,任何一个程序能创建的进程和线程的总数量,受操作系统参数限制,这个可以查看程序启动后,内存文件limit,在这个文件中,可以看到线程值,如果此时程序参数都进程加线程的总数达到了这个限制值,就会出现上面的错误,如果是这个限制参数的原因,可以临时调大系统限制参数值,然后重启服务解决,当然,这种概率比较低,一般只会在高并发业务中才可能出现;

然后,我们还得知道,进程是资源的拥有者,线程只是使用资源,但是,每个线程都有自己的线程栈,这个线程栈在JVM中是有限制的,超了也会报上面的错误,如果是这样,一般还会伴随StackOverflowError错误,这个就需要调整-Xss线程栈的值。

  • java.lang.OutOfMemoryError: Direct buffer memory

Java 允许应用程序通过 Direct ByteBuffer 直接访问堆外内存,许多高性能程序通过 Direct ByteBuffer 结合内存映射文件(Memory MApped File)实现高速 IO,但是它默认只有64MB,出现上面错误,可以调大-XX:MaxDirectMemorySize的大小,然后,去掉-XX:DisableExplicitGC配置

  • java.lang.OutOfMemoryError: Request size bytes for reason. Out of swap space

哈哈,这个错误要是被你遇到了。那我可得恭喜你,准备停机接受检查吧!这个错误什么意思呢,就是说一直在申请内存空间,把交换分区的空间都用光了。啥意思?咋来了个交换分区呢?交换分区,它是磁盘虚拟出来的,用来临时转存内存空间数据的,当内存不够用到时候,才会把内存中的数据转存到交换分区,以腾出内存空间。你现在不但内存空间不够用,交换分区空间都不够用了,哪还有内存啊,机器随时都可能‘嗝屁’。这种问题,要停掉一些其他程序,然后,仔细分析项目的堆栈信息,定位问题并解决。

现在,我们来看看怎么获取和分析OOM堆栈信息

 

首先,我们要明白,OOM是程序内存问题,出现这样的错误,很多时候,已经导致程序没有足够的内存去打印日志,所以,程序日志中不一定会有OOM的错误信息。但是,在遇到OOM问题时,我们需要OOM的错误信息,才能判断问题所在,所以,往往需要借助一些外部工具。

  • 在JVM的配置参数中添加打印参数

在JVM的配置参数中添加-XX:+
HeapDumpOnOutOfMemoryError,添加这个参数,JVM一旦出现OOM问题,就会打印出错误信息,但是,这个参数一般在开发和测试时才用,请不要用于生产环境。

  • 使用JDK自带工具jmap

JDK是java开发工具包集,它自带了jmap工具,使用jmap -dump:format=b,file=oom.bin pid的命令格式,可以dump下OOM信息。这是比较经典的做法,但是,如果堆栈比较大时,这个命令执行时间可能会非常长。

  • 使用开源的arthas工具

arthas是阿里开源和维护的一款java分析工具集,是java程序性能分析的高效工具。使用这个工具,直接使用heapdump命令,就能方便快速的dump下OOM信息,无论堆栈多大,dump的速度都非常快。

  • 使用阿里云的ARMS

如果你的云服务器是阿里的,可以付费使用ARMS监控系统,这是一整套监控系统,通过这个监控系统,可以观察到OOM信息。

获取到了OOM信息之后,一般会使用MAT工具进行分析。如果你有java基础,你可以自己下载MAT工具进行分析,如果没有,也可以把dump下的OOM信息给开发人员进行分析。



Tags:OOM   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇聊聊Jetpack Room实现数据存储持久性
Room介绍Room 是 Android Jetpack 组件库中的一部分,它是用于在 Android 应用中进行本地数据库访问和管理的库。Room 提供了一个抽象层,使开发者能够更轻松地访问 SQLite 数据...【详细内容】
2023-12-08  Search: OOM  点击:(143)  评论:(0)  加入收藏
什么是虚拟线程?一次启1000万个会OOM吗?
虚拟线程是在Java并发领域添加的一个新概念,那么虚拟线程到底是做什么用的呢?根据JEP中的内容告诉我们,虚拟线程是一种轻量级线程,可以显著地帮助我们减少编写、维护、观察高吞...【详细内容】
2023-10-30  Search: OOM  点击:(218)  评论:(0)  加入收藏
OOM异常会导致JVM退出吗?
熟悉Java开发的人,应该会经常遇到的异常:OOM,那么这个异常会导致 JVM 虚拟机退出吗?结论Java虚拟机(JVM)在运行Java应用时,可能会遇到内存不足的情况,从而抛出OutOfMemoryError(OOM)。...【详细内容】
2023-10-13  Search: OOM  点击:(243)  评论:(0)  加入收藏
远程办公不再?Zoom公司喊员工回来上班
【环球时报综合报道】在疫情期间推动远程工作革命的Zoom公司正告诉员工回到办公室。Zoom作为一个视频会议软件,在新冠疫情期间成为了远程工作的代名词。不过,据美国有线电视新...【详细内容】
2023-08-09  Search: OOM  点击:(70)  评论:(0)  加入收藏
Adobe照片编辑器Lightroom引入诸多AI功能:可去除噪点等
IT之家 4 月 19 日消息,Adobe 日前为 Premiere Pro 引入新的 AI 工具,可一句话改变视频季节;而现在也升级了 Lightroom 应用程序,引入了去除画面噪点等诸多 AI 功能。Adobe 于今...【详细内容】
2023-04-19  Search: OOM  点击:(274)  评论:(0)  加入收藏
OOM问题,无外乎这些
这篇文章,我们来讲一下JVM中最常见,也是最严重的性能问题OOM。首先,我们得知道,什么是OOM。OOM是OutOfMemoryError的英文缩写,通俗的讲,就是内存溢出错误。上次,我们说到JVM中有GC...【详细内容】
2023-04-14  Search: OOM  点击:(155)  评论:(0)  加入收藏
Zoom引入OpenAI生产力功能 推出数字助手
新浪科技讯 北京时间3月28日早间消息,云视频会议平台Zoom(68.57, -0.47, -0.68%)宣布与OpenAI合作为其生产力应用程序增加新功能,包括一款新的AI数字助手。这款数字助手能处理...【详细内容】
2023-03-28  Search: OOM  点击:(132)  评论:(0)  加入收藏
透视线上会议平台生存现状:Zoom裁员、国内企业举起收费大旗 线上会议室还能留住用户吗?
近日,视频会议软件开发商Zoom宣布拟裁员1300人,占全球员工的15%,中国区被裁员工将获得N+4的赔偿。至于原因,Zoom称此举是为适应当前不断放缓的视频会议服务需求。...【详细内容】
2023-02-14  Search: OOM  点击:(170)  评论:(0)  加入收藏
如何在Lightroom Classic中处理视频?教程来了
Lightroom Classic 是照片处理软件,能编辑视频吗?下面为您分享的是如何在 Lightroom Classic 中处理视频,一起来看看吧。要将视频文件导入 Lightroom Classic,请按照与导入照片...【详细内容】
2023-02-12  Search: OOM  点击:(138)  评论:(0)  加入收藏
线程池不关闭引发的OOM血案
又踩坑了系列&hellip; 得到反馈管理端一个返回系统基本权限数据的接口服务端异常了。查看错误日志: 竟然是OOM,Java应用程序已达到其可以启动线程数量的极限了。肯定是有地方...【详细内容】
2022-02-28  Search: OOM  点击:(503)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条