记一次生产jvm oom问题

前言

        jvm添加以下参数,发生OOM时自动导出内存溢出文件

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt

  内存分析工具: MAT, 下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation, 注意工具地址要跟你的jdk匹配,至少你的jdk要比MAT的需要的高

参考使用地址:JVM 内存分析工具 MAT 的深度讲解与实践——入门篇 - 掘金

生产业务简单描述

        小程序注册用户推送,需要发布一个注册事件进行上报处理,逻辑需要设备的数据,而这部分数据发生在用户注册以后才会生成,可能隔个几秒才会出来,所以才需要借助延时队列进行处理。10s后再进行发布

        之所以会有这种并发问题是因为这个小程序在有广告投放的时候会瞬间很多流量打进来,从而引起这种问题。

分析dump文件

主界面如下

Histogram方式

然后选择如下信息

可以看到byte[]的第一个引用是com.zxc.movie.main.bo.movie.ScheaTest$ZxcUser,到此就能找到源头了,可以全局搜索该类的引用情况

dominator_tree方式

也可以很容易定位到com.zxc.movie.main.bo.movie.ScheaTest$ZxcUser引用的问题

模拟代码如下

package com.zxc.movie.main.bo.movie;import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ScheaTest {public static void main(String[] args) throws Exception{ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);//        TimeUnit.SECONDS.sleep(20);System.out.println("come");while (true) {Thread.sleep(100);executor.schedule(new ZxcRunner(), 1000, TimeUnit.SECONDS);}}public static class ZxcRunner implements Runnable {private ZxcUser zxcUser = new ZxcUser();public ZxcUser getZxcUser() {return zxcUser;}@Overridepublic void run() {System.out.println(zxcUser);}}public static class ZxcUser {private byte[] bytes = new byte[1024 * 1024];}
}

确实是com.zxc.movie.main.bo.movie.ScheaTest$ZxcUser出现了问题

总结

        这里是我模拟的一个情况,可能比较好定位,真实的业务情况可能稍微复杂点,但是业务就是这么个事,延时任务里面对象一瞬间过多导致内存溢出了

解决方案

            真实的业务情况不会推迟1000s才执行任务,大概在10s内就可以发出去了,这里只是为了更好的看到这个问题,也就是说生产上在10s内进入了很多事件,导致发生了OOM的问题,改进如下

package com.zxc.movie.main.bo.movie;import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ScheaTest {public static void main(String[] args) throws Exception{ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);//        TimeUnit.SECONDS.sleep(20);while (true) {Thread.sleep(100);if(executor.getQueue().size() < 5) {executor.schedule(new ZxcRunner(), 1000, TimeUnit.SECONDS);} else {System.out.println("队列满了,待释放");}}}public static class ZxcRunner implements Runnable {private ZxcUser zxcUser = new ZxcUser();public ZxcUser getZxcUser() {return zxcUser;}@Overridepublic void run() {System.out.println(zxcUser);}}public static class ZxcUser {private byte[] bytes = new byte[1024 * 1024];}
}

改为了判断队列的大小超过指定值就不放进去了,这样生产10s出现很多内容也不会有问题了,解决完效果如下

当队列小于指定的大小便可以正常加入,超出的时候就把任务丢了,防止内存异常,这里把任务丢了是因为业务允许,如果业务不允许那么就需要把这部分任务给存储起来后续再进行操作

备注

        之所以这样做是因为生产这方面的数据是允许丢失的,如果你的数据比较重要的话那可以先临时存到其他地方,然后再拿出来去处理,或者数据不要用这种内存的方式来异步了,可以借助MQ的延时队列去处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2807227.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【多线程】volatile 关键字、wait 和 notify方法详解

volatile 、wait 和 notify &#x1f332;volatile关键字&#x1f6a9;保证内存可见性&#x1f6a9;volatile 不保证原⼦性 &#x1f333;wait 和 notify方法&#x1f6a9;wait()&#x1f6a9;notify()&#x1f6a9;notifyAll()方法 ⭕wait 和 sleep 的对比&#xff08; 面试题…

中国农业无人机行业市场现状分析与投资前景预测研究报告

全版价格&#xff1a;壹捌零零 报告版本&#xff1a;下单后会更新至最新版本 交货时间&#xff1a;1-2天 第一章农业无人机行业发展综述 第一节农业无人机行业定义及分类 一、农业无人机行业的定义 农业无人机是一种无人驾驶的飞行器来帮助优化农业经营&#xff0c;增加作…

深入理解基于 eBPF 的 C/C++ 内存泄漏分析

对于 C/C 程序员来说&#xff0c;内存泄露问题是一个老生常谈的问题。排查内存泄露的方法有很多&#xff0c;比如使用 valgrind、gdb、asan、tsan 等工具&#xff0c;但是这些工具都有各自的局限性&#xff0c;比如 valgrind 会使程序运行速度变慢&#xff0c;gdb 需要了解代码…

政府采购网有哪些回款方式

政府采购网的回款方式多种多样&#xff0c;具体取决于采购项目的性质、规模以及采购单位与供应商之间的约定。以下是一些常见的政府采购网回款方式&#xff1a; 线上支付&#xff1a;随着电子商务的发展&#xff0c;越来越多的政府采购项目采用线上支付方式。这种方式方便快捷&…

C# 中 SQLite 查询数据库表中字段(列)是否存在的方法

查询SQLite数据库表中字段&#xff08;列&#xff09;存在的方法 使用SQL语句为&#xff1a;PRAGMA table_info([DeviceTrees]); 其中“DeviceTrees”为数据库表的名称。 使用SQLite Expert Professional工具&#xff0c;查看该语句是否起作用&#xff0c;这里使用的版本是…

Python中json模块介绍及学习

简介 json模块是Python标准库中的一个用于处理JSON数据的模块&#xff0c;它提供了一组方法来进行 JSON 数据的解析和生成。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;常用于数据传输和配置文件。 下面是json模块的一些常…

详解Megatron中的数据混合算法(BlendableDataset)

&#x1f9d1;‍&#x1f4bb; 本文主要讲解Megatron早期版本中的数据混合算法。 目录 1. 数据混合2. 源码解析3. 证明部分&讨论4. 进一步优化 1. 数据混合 在谈源码之前&#xff0c;我们有必要先了解一下Megatron中的数据混合思想。 给定 n n n 个数据集 D 1 , D 2 , …

Flask基础学习3

参考视频&#xff1a;41-【实战】答案列表的渲染_哔哩哔哩_bilibili flask 实现发送短信功能 pip install flask-mail # 安装依赖 我这里用登录的网易邮箱获取的授权码&#xff08;登录QQ邮箱的授权码总是断开收不到邮件&#xff09;&#xff0c; # config # config mail MAI…

十一、Qt数据库操作

一、Sql介绍 Qt Sql模块包含多个类&#xff0c;实现数据库的连接&#xff0c;Sql语句的执行&#xff0c;数据获取与界面显示&#xff0c;数据与界面直接使用Model/View结构。1、使用Sql模块 &#xff08;1&#xff09;工程加入 QT sql&#xff08;2&#xff09;添加头文件 …

第八章:指针

第八章:指针 指针重要性: 数据库–>动态分配内存数据结构–>链表、队列、树、图等操作系统–>改善子程序的效率指针为函数提供修改变量值的手段8.1-地址和指针 变量的地址 计算机中,数据存储在内存中 内存:是内部存储器,由存储单元组成的。内存可划分为若干存储单…

Map集合特点、遍历方式、TreeMap排序及Collections和Arrays

目录 ​编辑 一、集合框架 二、 Map集合 特点 遍历方式 HashMap与Hashtable的区别 TreeMap Collections Arrays 一、集合框架 二、 Map集合 Map集合是一种键值对的集合&#xff0c;其中每个键对应一个值。在Java中&#xff0c;Map接口定义了一种将键映射到值的数据结…

02|Order by与Group by优化

索引顺序依次是 &#xff1a; name,age,position 案例1 EXPLAIN SELECT * FROM employees WHERE name LiLei AND position dev ORDER BY age;分析: 联合索引中只是用到了name字段做等值查询[通过key_len 74可以看出因为name字段的len74]&#xff0c;在这个基础上使用了age进…

halcon中的一维测量

一维测量 像点到点的距离&#xff0c;边缘对的距离等沿着一维方向的测量都属于1D测量范畴。Halocn的一维测量首先构建矩形或者扇形的ROI测量对象&#xff0c;然后在ROI内画出等距离的、长度与ROI宽度一致的、垂直于ROI的轮廓线&#xff08;profile line&#xff09;的等距线。…

VBA实现快速逆透视

实例需求&#xff1a;将工作表中的数据&#xff08;多维度交叉&#xff09;&#xff0c;对日期进行逆透视&#xff0c;转换为下表的格式。 示例代码如下。 Sub UnpivotTable()Dim oSht As WorksheetDim inLastRow As Long, inLastCol As LongDim outLastRow As Long, outCol …

python毕设选题 - 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录 0 前言课题背景分析方法与过程初步分析&#xff1a;总体流程&#xff1a;1.数据探索分析2.数据预处理3.构建模型 总结 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到…

最简单的基于 FFmpeg 的编码器 - 纯净版(不包含 libavformat)

最简单的基于 FFmpeg 的编码器 - 纯净版&#xff08;不包含 libavformat&#xff09; 最简单的基于 FFmpeg 的视频编码器&#xff08;YUV 编码为 HEVC&#xff08;H.265&#xff09;&#xff09;正文结果工程文件下载 最简单的基于 FFmpeg 的视频编码器&#xff08;YUV 编码为 …

ES坑-创建索引使用_下划线-黑马旅游搜不到

学ES的时候&#xff0c;星级过滤无效 找不到数据。 需要 但是我们在创建的时候使用的是keyword 通过研究发现&#xff0c;我们导入数据的时候应该默认的为starName 我get库时候发现有2个字段 所以通过star_name搜索因为都是空数据搜不到&#xff0c;而starName类型为text所以…

UE蓝图 函数调用(CallFunction)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 UE蓝图 函数调用(CallFunction)节点和源码 文章目录 系列文章目录一、Call…

使用PM2实现高效的应用监控与管理

微信搜索“好朋友乐平”关注公众号。 1. pm2 PM2 是一个流行的进程管理器&#xff0c;用于 Node.js 应用程序。它支持应用程序的负载均衡、自动重启、日志管理、监控以及多环境管理等功能。PM2让开发者能够以守护进程的方式运行和管理 Node.js 应用&#xff0c;即使在应用崩溃…

什么是负载均衡集群?

目录 1、集群是什么&#xff1f; 2、负载均衡集群技术 3、负载均衡集群技术的实现 4、实现效果如图 5、负载均衡分类 6、四层负载均衡&#xff08;基于IP端口的负载均衡&#xff09; 7、七层的负载均衡&#xff08;基于虚拟的URL或主机IP的负载均衡) 8、四层负载与七层…