记一次生产jvm oom问题

news2024/10/5 15:28:42

前言

        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;
        }

        @Override
        public 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;
        }

        @Override
        public void run() {
            System.out.println(zxcUser);
        }
    }

    public static class ZxcUser {
        private byte[] bytes = new byte[1024 * 1024];
    }
}

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

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

备注

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

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

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

相关文章

Uncertainty-Aware Mean Teacher(UA-MT)

Uncertainty-Aware Mean Teacher 0 FQA:1 UA-MT1.1 Introduction:1.2 semi-supervised segmentation1.3 Uncertainty-Aware Mean Teacher Framework 参考&#xff1a; 0 FQA: Q1: 不确定感知是什么意思&#xff1f;不确定信息是啥&#xff1f;Q2&#xff1a;这篇文章的精妙的点…

AI绘画工具有哪些?

AI绘画工具是利用人工智能技术来辅助或生成艺术作品的工具。这些工具可以分为两类&#xff1a;一类是生成艺术作品的工具&#xff0c;另一类是辅助艺术创作的工具。本文将介绍一些主流的AI绘画工具&#xff0c;并分析它们的特点和适用场景。 1. DALL-E DALL-E 是由 OpenAI 开发…

并发编程(5)共享模型之不可变

7 共享模型之不可变 本章内容 不可变类的使用不可变类设计无状态类设计 7.1 日期转换的问题 问题提出 下面的代码在运行时&#xff0c;由于 SimpleDateFormat 不是线程安全的, 有很大几率出现 java.lang.NumberFormatException 或者出现不正确的日期解析结果&#xff0c;…

Java+SpringBoot,打造极致申报体验

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

web安全学习笔记【16】——信息打点(6)

信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等[1] #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-C…

东方博宜 1519. 求1~n中每个数的因子有哪些?

东方博宜 1519. 求1~n中每个数的因子有哪些&#xff1f; #include<iostream> using namespace std; int main() {int n ;cin >> n ;for(int i 1 ; i < n ; i){int a[1000] ;int k 0 ;for(int j 1 ; j < i ; j){if(i%j0){a[k] j ;k ;} }cout << i …

Golang Redis:构建高效和可扩展的应用程序

利用Redis的闪电般的数据存储和Golang的无缝集成解锁协同效应 在当前的应用程序开发中&#xff0c;高效的数据存储和检索的必要性已经变得至关重要。Redis&#xff0c;作为一个闪电般快速的开源内存数据结构存储方案&#xff0c;为各种应用场景提供了可靠的解决方案。在这份完…

从docx提取文本的Python实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

限流算法

下面对常见的限流算法进行讨论。目前&#xff0c;常用的限流算法主要有三种&#xff1a;计数器法、滑动窗口算法、漏桶算法和令牌桶算法。下面分别介绍其原理。 1. 计数器法 计数器法是通过计数对到来的请求进行选择性处理。如系统限制一秒内最多有X个请求&#xff0c;则在该…

opengles 顶点坐标变换常用的矩阵(九)

文章目录 前言一、opengles 常用的模型矩阵1. 单位矩阵2. 缩放矩阵3. 位移矩阵4. 旋转矩阵二、第三方矩阵数学库1. glm1.1 ubuntu 上安装 glm 库1.2 glm 使用实例1.2.1 生成一个沿Y轴旋转45度的4x4旋转矩阵, 代码实例如下1.2.2 生成一个将物体移到到Z轴正方向坐标为5处的4x4 vi…

黑马JavaWeb开发跟学(一)Web前端开发HTML、CSS基础

黑马JavaWeb开发一.Web前端开发HTML、CSS基础 引子、Web开发介绍传统路线本课程全新路线本课程适用人群课程收获一、什么是web开发二、网站的工作流程三、网站的开发模式四、网站的开发技术 前端开发基础一、前端开发二、HTML & CSS2.1 HTML快速入门2.1.1 操作第一步第二步…

数据存储-文件存储

一、CSV文件存储 csv是python的标准库 列表数据写入csv文件 import csvheader [班级, 姓名, 性别, 手机号, QQ] # 二维数组 rows [[学习一班, 大娃, 男, a130111111122, 987456123],[学习二班, 二娃, 女, a130111111123, 987456155],[学习三班, 三娃, 男, a130111111124, …

qt波位图

1&#xff0c;QPainter 绘制&#xff0c;先绘制这一堆蓝色的东西, 2&#xff0c;在用定时器&#xff1a;QTimer&#xff0c;配合绘制棕色的圆。用到取余&#xff0c;取整 #pragma once#include <QWidget> #include <QPaintEvent>#include <QTimer>QT_BEGIN_…

基于Docker和Springboot两种方式安装与部署Camunda流程引擎

文章目录 前言1、Docker安装1.1、拉取Camunda BPM镜像1.2、编写docker启动camunda容器脚本1.3、docker启动脚本1.4、访问验证 2、SpringBoot启动2.1、下载地址2.2、创建SpringBoot项目并配置基础信息2.3、下载SpringBoot项目并在idea中打开2.4、pom修改2.5、application.yml配置…

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为&#xff1a;感知机(Neuron)的学习算法主要包括以下步骤&#xff1a;感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法&#xff0c;用于将输入…

pclpy Ransac平面分割算法输出的索引从点云中提取点云的子集

pclpy Ransac平面分割算法输出的索引从点云中提取点云的子集 一、算法原理二、代码三、结果1.sor统计滤波2.Ransac内点分割平面3.Ransac外点分割平面 四、相关数据 一、算法原理 1、Ransac介绍 RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outlier…

第6.3章:StarRocks查询加速——Bucket Shuffle Join

目录 一、StarRocks数据划分 1.1 分区 1.2 分桶 二、Bucket Shuffle Join实现原理 2.1 Bucket Shuffle Join概述 2.2 Bucket Shuffle Join工作原理 2.3 Bucket Shuffle Join规划规则 三、应用案例 注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Bucket Shuffle Jo…

计网 - 深入理解HTTPS:加密技术的背后

文章目录 Pre发展历史Http VS HttpsHTTPS 解决了 HTTP 的哪些问题HTTPS是如何解决上述三个风险的混合加密摘要算法 数字签名数字证书 Pre PKI - 数字签名与数字证书 PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 发展历史 HTTP&#xff08;超文本传输协…

DAY30--learning English

一、积累 1.budget 2.fabulous 3.strait 4.jut 5.grater 6.fillet 7.fin 8.decay 9.cartilage 10.gill 11.convex 12.concave 13.tender 14.trim 15.workload 16.knuckle 17.crevice 18.skew 19.membrane 20.delicate 二、练习 1.牛津原译 Budget /ˈbʌdʒɪt/ 1.[ CU]the…

HarmonyOS创建一个ArkTS卡片

创建一个ArkTS卡片 在已有的应用工程中&#xff0c;创建ArkTS卡片&#xff0c;具体操作方式如下。 创建卡片。 根据实际业务场景&#xff0c;选择一个卡片模板。 在选择卡片的开发语言类型&#xff08;Language&#xff09;时&#xff0c;选择ArkTS选项&#xff0c;然后单…