JVM OOM

排查和解决JVM OOM实战 本文深入探讨Java虚拟机(JVM)中的内存区域布局及常见的内存溢出错误(OOM)类型,不仅限于堆内存,还包括元空间和直接内存等。通过沃尔玛支付中台的实战案例,详细解析了一次因内存泄漏导致的OOM事故排查过程。从问题表现、排查手段到最终解决方案,全面展示了如何运用jmap、MAT等工具定位内存泄漏点,并修复代码以避免类似问题再次发生。无论你是Java开发者还是系统运维人员,都能从中获得宝贵的经验和技巧,提升系统稳定性和性能。 阅读详情


JVM内存溢出分为两种情况: OutOfMemoryError和 StackOverflowError

  • OutOfMemoryError是在程序无法申请到足够的内存的时候抛出的异常
  • StackOverflowError是线程申请的栈深度大于虚拟机所允许的深度所抛出的异常

java.lang.OutOfMemoryError:Java heap space 堆内存溢出
解决办法:设置堆内存大小,设置jvm值的方法是调大-Xms(堆的最小值),-Xmx(堆的最大值)

java.lang.StackOverflowError 栈内存溢出
栈溢出产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用, 也会发生栈溢出。解决办法:
设置线程最大调用深度:-Xss5m

栈溢出几种情况及解决方案:
一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
三、指针或数组越界。例如进行字符串拷贝或处理用户输入等等。

解决这类问题的办法有两个,一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。

内存溢出发生的区域

  • Program Counter Regster(程序计数器):每一个用户线程对应一个程序计数器,用来指示当前线程所执行字节码的行号。由程序计数器给文字码解释器提供下一条要执行的字节码的的位置。根据jvm规范,这个区域不会发生内存溢出
  • Java stack(java 虚拟机栈):这个区域是最容易出现内存异常的区域,每一个线程对应生成一个线程栈,线程每执行一个方法的时候,都会创建一个栈帧,用来存放方法的局部变量表,操作树栈,动态连接,方法入口。jvm规范对这个区域定义了两种内存异常。如果虚拟机在扩展栈时无法申请到足够的内存空间则抛出OutOfMemoryError如果线程请求的栈深度大于虚拟机所允许的最大深度,将会抛出StackOverflowError
  • Native MethodStack(本地方法栈):和虚拟机栈一样,不同的是处理的对象不一样,虚拟机栈处理java的字节码,而本地栈则是处理的Native方法。其他方面一致
  • Heap(堆):前面说了堆是所有线程都能访问的,随着虚拟机的启动而存在,这块区域很大,因为所有的线程都在这个区域保存实例化的对象,因为每一个类型中,每个接口实现类需要的内存不一样,一个方法内的多个分支需要的内存也不尽相同,我们只有在运行的时候才能知道要创建多少对象,需要分配多大的地址空间。GC关注的正是这样的部分内容,所以很多时候也将堆称为GC堆。堆中肯定不会抛出StackOverflowError类型的异常,所以只有OutOfMemoryError相关类型的异常
  • Method Area(方法区):用于存放已被虚拟机加载的类信息,常量,静态方法,即使编译后的代码。由于早期的 Hotspot JVM 实现,很多人习惯于将方法区称为永久代(Permanent Generation)。这个区域只能抛出OutOfMemoryError类型的错误,OutOfMemoryError: PermGen space。
解决方法: 手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m"

元空间发生OOM
Metaspace 是存类/方法的加载信息的,发生OOM的可能原因:
1.Metaspace 设置小了
2.持续创建类 导致Metaspace 元空间不够用

Metaspace 元空间是什么参数决定的?

-XX:MaxMetaspaceSize=100m

内存泄漏

内存泄漏和内存溢出的区别和联系

1、内存泄漏指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出
2、内存溢出指程序申请内存时,没有足够的内存供申请者使用,此时就会报错OOM
3、内存泄漏的堆积最终会导致内存溢出

Java发生内存泄漏的情况

1、静态集合类引起内存泄漏
  像HashMap等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,引用的所有对象也不会被释放
2、监听器
  一个应用当中会用到很多监听器,我们会调用一个控件的监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会
3、单例模式
  单例对象在初始化后将在JVM的整个生命周期中存在,如果单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,导致内存泄漏
4、各种连接
  比如数据库连接、网络连接(socket)和io连接,除非显式调用了close()方法将其连接关闭,否则是不会自动被GC回收的

内存泄漏排查

1.首先用top,TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序
2. 利用jstack -l < pid> 查看那些cpu使用率过高的线程,看是否大多数是gc线程,如果是说明gc过于频繁,而且耗时过长,导致应用线程被挂起,无法响应客户端发来的请求,这种情况就应该是内存泄露的问题了。
3. 用jmap讲进程的堆转储文件dump出来到heap.bin文件中,然后用Eclipse Memory Analyzer (MAT)打开堆转储文件进行分析

自适应滤波算法综述 阅读详情

相关推荐

1173:阶乘和

1173:阶乘和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6010 通过数: 3049 【题目描述】 用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。 输入正整数n,输出计算结果S。 【输入】 一个正整数n。 【输出】 计算结果S。 【输入样例】 5 【输出样例】 153 思路: ...

zqhf123的博客 1260

jvm调优

jvm相关指令,top,jstack,jmap,jinfo,jstat,jvm相关参数

weixin_38612401的博客 6万+

用Python玩转ROS机械臂:YOLO目标检测+MoveIt!自动抓取仿真教程

本文详细介绍了如何利用Python集成YOLO目标检测与ROS的MoveIt!运动规划库,实现机械臂的智能抓取仿真。通过Gazebo仿真环境,从视觉感知、坐标转换到运动规划与执行,构建了一套完整的自动化抓取系统,为机器人视觉抓取应用提供了可复现的实践方案。

ppp33的博客 552

【JVM调优】如何进行JVM调优?一篇文章就够了!

深入解读JVM性能的监控、定位和调优方案,阐述jps/stat/jstack、MAT等常用性能分析工具的使用,提出JVM参数、内存溢出、内存泄漏、CPU飙升、GC频繁等实际场景下JVM调优的方案。

种一棵树最好的时间是十年前,其次是现在 4万+

【系统分析师】2025年下半年真题:案例分析-答案及详解(回忆版)

Redis相比Memcached在电商高并发场景下具有显著优势:支持持久化(RDB/AOF)、丰富数据结构(如有序集合实现排行榜)、原生支持集群和哨兵模式(高可用性)。布隆过滤器通过位数组和哈希函数预先存储所有合法订单ID,当查询请求到达时快速拦截无效ID(如伪造ID),避免其穿透缓存直接冲击数据库,从而预防缓存击穿问题。

数据知道的博客 5986

Google Earth Engine:LandTrendr (Landsat Collection 2)全更新使用(代码调用+UI交互)

本文介绍了使用Landsat Collection 2进行连续变化监测的分析方法,包含代码实现和可视化界面两部分。代码部分通过Google Earth Engine平台运行LandTrendr算法,设置参数包括时间范围、光谱指数、变化检测阈值等,最终生成变化幅度和检测年份的可视化图层,并将结果导出至Google Drive。可视化界面部分展示了基于LandTrendr的土地覆盖变化结果,结合Landsat影像进行分析。整个方法实现了从数据处理到结果展示的完整流程,适用于森林覆盖等环境变化监测。

此星光明博客 211

JVM调优

因此,建议在调优之前先进行性能分析和监测,针对性地调整参数,并进行实际测试和验证,以确保优化的效果和稳定性。每个参数都有特定的作用和含义,根据具体需求和应用程序的特点,选择适当的参数进行配置和调整。:垃圾回收是JVM的重要功能,但不恰当的垃圾回收策略可能导致长时间的停顿和性能下降。JVM调优旨在选择合适的垃圾回收器、调整垃圾回收参数,平衡吞吐量和停顿时间,减少垃圾回收对应用程序的影响。通过选择合适的垃圾回收器算法和参数,调整垃圾回收策略,可以降低垃圾回收的频率,提高系统的运行效率。

CA优快云的博客 8855

第12篇:TMC2240 CoolStep节能功能|软件配置+功耗测试(保姆级)

本文介绍了TMC2240驱动芯片的CoolStep节能功能,通过动态调节电机电流实现功耗优化。CoolStep利用StallGuard技术实时检测负载,自动调整运行电流,空载时可降低50%以上功耗。文章详细讲解了节能原理、寄存器配置方法和参数校准步骤,提供可直接复用的STM32代码。该功能特别适合电池供电设备,能显著延长续航时间,同时保持电机性能稳定。配置时需注意SG阈值、电流步长等关键参数,并可与静音模式叠加使用。

BackCatK Chen的博客 918

JVM性能调优详解

前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备。这篇文章带领大家学习JVM性能调优的知识。 性能调优 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。 性能调优基本上按照以下步骤进行:明确优化目标、发现性能瓶颈、性能调优、通过监控及...

程序新视界 7705

092、Python在芯片验证中的应用:从脚本小子到验证架构师

Python在芯片验证中的高效应用 本文通过实际案例展示了Python在芯片验证中的关键作用。凌晨三点的调试场景揭示了传统方法的局限,Python脚本能在20分钟内分析80GB波形数据定位FIFO指针问题。文章重点介绍了两个核心工具: 智能日志分析系统:通过正则表达式和上下文分析,自动分类百万行验证日志中的错误,生成可视化报告,效率远超传统grep方法。 寄存器模型生成器:将Excel表格自动转换为UVM寄存器模型代码,将原本需要两周的手工工作缩短至两小时,同时保证零错误。 文章还展示了Python与Sys

z534437748的博客 72

材料带隙预测(图神经网络)(⭐⭐)—— 用晶体图网络预测钙钛矿材料的能带隙,加速光伏材料筛选。技术栈:CGCNN、MEGNet、Materials Project数据集

钙钛矿太阳能电池以其高效率、低成本的优势迅速崛起,但传统“试错法”材料筛选效率极低,严重制约了光伏技术的迭代速度。近年来,基于图神经网络的材料带隙预测方法,特别是晶体图神经网络(CGCNN)和材料图网络(MEGNet),为这一问题提供了革命性的解决方案。本文系统梳理了材料带隙预测从传统计算到深度学习的演进历程,深入剖析了CGCNN与MEGNet的架构设计、数学原理及创新机制,详细阐述了Materials Project数据集的构建、特征工程与处理策略。

2201_76125393的博客 47

JVM篇之调优

一、概述 1.了解JVM调优之前我们需要知道两个概念:吞吐量(TPS)和响应时间(RT)。 吞吐量:指系统在单位时间内处理请求的数量。对于并发系统,通常需要用吞吐量作为性能指标。 响应时间:指系统对请求作出响应的时间。对于单用户的系统,响应时间可以很好地度量系统的性能。 2.什么是JVM调优? 简单理解,JVM调优主要就是为了解决系统运行时慢、卡顿、OOM、死锁等问题。 其实上面所说的问题存在很多方面的原因,比如网络波动导致响应时间慢、数据库查询慢、死锁等,今天我们主要分析JVM层面的,而JVM调优,主要是

qq_42809478的博客 1万+

YOLOv8 | 代码逐行解析(二) | 从yaml文件到模型定义(代码逐行注释,小白必看)

本文给大家带来的是YOLOv8项目的解读,之前给大家分析了YOLOv8的项目文件分析,这一篇文章给大家带来的是模型训练从我们的yaml文件定义到模型的定义部分的讲解,我们一般只知道如何去训练模型,和配置yaml文件,但是对于yaml文件是如何输入到模型里,模型如何将yaml文件解析出来的确是不知道的,本文的内容接上一篇的代码逐行解析(一) 项目目录分析,本文对于小白来说非常友好,非常推荐大家进行阅读,深度的了解模型的工作原理已经流程,下面我们从yaml文件来讲解。

Snu77的博客 1万+

JVM问题排查——OOM

文章目录环境准备工作排查姿势一:使用JVisualVM排查姿势二:使用Jps+Jstack 环境 JDK8   准备工作 先准备好一个OOM程序:(程序是网上随便找的) public class DeadLock { public static String obj1 = "obj1"; public static String obj2 = "obj2"; p...

m0_46311226的博客 4362

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JVM实战—OOM的生产案例

这个系统是比较早的一个系统,在进行服务间的RPC通信时,采用的是基于Thrift框架封装的RPC框架。然后公司的系统,就是基于这个RPC框架去进行通信。通过源码的分析,我们最终总算搞清楚了,原来当时有这么一个特殊的情况:因为RPC框架要进行对象传输,就必须让服务A和服务B都知道有该对象。举个例子,比如服务A要把一个Request对象传输给服务B。//这里是一堆的自动生成的代码。

dsgdauigfs的博客 1833

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【JVM】OOM

【JVM】OOM

qq_44077764的博客 1155

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《JVM如何排查OOM》

理解JVM内存模型和各区域作用熟练使用各种诊断工具建立系统化的排查思路积累常见场景的解决经验重视预防和监控,而非仅事后补救记住:好的开发者不是不会遇到OOM,而是能够快速定位和解决OOM问题。希望本文能帮助你在遇到OOM时不再恐慌,而是有条不紊地解决问题。

2301_81117855的博客 1441

【JVM】OOM实例分析

本文系统解析了Java四大内存溢出场景及解决方案:​​堆内存溢出​​由大对象分配或内存泄漏引发,通过MAT分析堆转储定位问题;​​元空间溢出​​多因动态代理类暴增,需启用类缓存并监控加载状态;​​GC超限异常​​反映GC效率低下,结合日志与堆转储排查常驻对象;​​线程创建失败​​受系统线程数限制,需调整Xss参数及内核配置。各案例均配套JVM参数(如-XX:+HeapDumpOnOutOfMemoryError)、诊断工具(MAT/JVisualVM)和修复策略(代码优化/资源控制),为OOM问题提供从定位

白晨的博客 1379

9 OOM和JVM退出。OOM后JVM一定会退出吗?

在我们在main函数内部启动的线程发生OOM的时候该线程退出,线程池OOM线程池创建的线程结束。要主线程无关,并且JVM不会退出什么时候OOMJVM会退出呢?1:所有的非守护线程由于申请不到内存而OOM,所有非守护线程退出,JVM退出,这个属于主动退出OOM的发生表示了此刻JVM堆内存告罄,不能分配出更多的资源,或者GC回收效率不可观。一个线程的OOM,在一定程度的并发下,若此时其他线程(含非守护线程)也需要申请堆内存,那么其他线程也会因为申请不到内存而OOM,甚至连锁反应导致整个JVM的退出。

yusongcao的博客 1106

【GC日志和OOM日志分析】JVM GC日志和OOM Dump文件分析

文章讲解如何正确分析GC日志,排查OOM引发的原因,为优化JVM寻找理论数据依据。

天然玩家的博客 2922

OOM异常会导致JVM退出吗?

OOM异常会导致JVM退出吗?

理查德的博客 2503

JVM之OOM

什么是OOM? 说白了就是内存用完了 JVM没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error(说明应用程序已经无法处理这种问题) 那么,为什么会没有内存了呢??? 分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。 应用占用的太多,并且用完没释放,浪费了。此时就会造成内存泄漏或者内存溢出。 OOM会造成以下情况: 内存泄露: 申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不

PAN17610011759的博客 668

JVM调优实战之OOM

OOM与JVM调优相关的问题一直是难点,只能感叹,大家都太不容易了。明明只是小白、明明只想找份工作、明明没有机会接触到OOM与调优……却被现实逼着要去搞懂JVM、OOM、调优……本篇文章是结合大厂与小厂的同学们问的问题,结合我的工作经历整理总结而来。看懂、理解、背下来,当面试官再问你OOM与调优,一定被你征服。 看完这篇文章,大家能获得的知识: 1、什么是OOM 2、为什么会发生OOM 3、哪些区域会发生OOM 4、JVM进程挂了,会有哪些可能性 5、生产环境的JVM无响应了,如何快速定位问题 什么是OOM

m0_46527847的博客 864

【JVM】 OOM异常会导致JVM退出吗?

参考 JVM OOM异常会导致JVM退出吗

m0_45406092的博客 1762

JVM OOM(OutOfMemoryError)问题排查与解决

JVM OOM问题是Java开发中常见且棘手的问题,但通过合理的内存管理、GC优化和代码调优,开发者可以有效防止OOM的发生。在实际生产环境中,OOM问题的排查需要结合日志、Heap Dump和监控工具,针对不同类型的OOM采取不同的解决方案。通过GC日志,我们可以判断内存回收的效率,查看Full GC和Minor GC的频率,是否存在GC Overhead Limit Exceeded等问题。GC日志是排查OOM问题的核心工具之一。OOM异常可以发生在不同的内存区域,每种OOM异常都代表不同的内存问题。

lssffy的博客 4010

OOM和JVM配置优化

       OOM这个缩写就是Java程序开发过程中让人最头痛的问题:Out of Memory。在很多开发人员的开发过程中,或多或少的都会遇到这类问题,这类问题定位比较困难,往往需要根据经验来判断可能出现问题的代码。原因主要是两个:对象没有被释放(多种情况引起,往往是比较隐蔽的引用导致被Hold而无法被回收)。另一种就是真的Memory不够用了,需要增加JVM的Heap来满足应用程序的需求。最

elimago的专栏 739
上一篇: 工厂模式
下一篇: 数据库锁的分类
K. Bob
博客等级 码龄8年 82粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值