多线程下的OOM问题

news2025/1/10 21:20:19

多线程下的OOM问题

  • 前言
  • 问题排查
    • 日志查看
    • 代码查看
    • 集群查看
    • 问题解决
  • 多线程OOM时候的回收
    • 测试代码
    • 启动参数设置
    • 控制台打印

前言

最近的一台服务器出现了OOM的情况,出于好奇就进行了一些探查,这里做一些简单的记录

问题排查

日志查看

登陆服务器查看当天的报错日志,根据服务器的错误日志定位到了代码,发现是一个定时任务引起的,发现该定时任务报错的同时还有一个线程也在打印错误信息。所以想到了两个可能的问题:

  1. 新增的定时任务冲突,导致多个线程同时跑任务,导致最后OOM
  2. 源代码就有问题,数据量增多导致的定时任务出现的问题

代码查看

根据代码可以发现没有大对象的存在,最大的对象也只是几千万的Long对象,但是哪怕1亿的Long对象 也不会导致OOM,所以排出了代码问题。

集群查看

由于是分布式定时任务,也就是说定时任务是随机分发的,先对该任务的执行历史进行查看,发现执行的历史记录发现同一台机器,前一天失败了,但是后一天却成功了,而其他的所有机器都是成功的。也就是可以确定源代码应该没有问题。
在这里插入图片描述
所以怀疑是问题一导致的OOM,该服务器的JVM参数没同步,即可能数据量增多之后,其他的服务器都进行了扩容,但是该服务器忘记扩容导致的,故先去集群的监控中心查看其他的服务器的堆内存大小,发现确实该服务器的内存只有8G,而其他的服务器都已经扩容到了12G。再根据其他的禁用的服务器,发现都是8G。

问题解决

机器申请扩容最后成功解决问题

多线程OOM时候的回收

上面说在查看服务器的错误日志的时候,发现一个任务的所有线程都OOM了,但是另一个定时任务的线程没有立即结束,还在运行并进行日志的打印。故进行了简单测试,查看当多线程的情况下某个线程OOM之后会发生什么?怎么样才会彻底OOM直接宕机?

测试代码

public class OutOfMemoryTest {

    public static void main(String[] args) {
        new Thread(() -> {
            List<byte[]> list = new ArrayList<>();
            while (true) {
                list.add(new byte[1024 * 1024 * 50]);
                System.out.println(Thread.currentThread().getName());
                try {
                    Thread.sleep(1_000);
                } catch (Exception e) {
                }
            }
        }, "dead thread").start();

        new Thread(() -> {
            while (true) {
                System.out.println(Thread.currentThread().getName());
                try {
                    Thread.sleep(1_000);
                } catch (Exception e) {
                }
            }
        }, "alive thread").start();
    }
}

启动参数设置

-Xmx10m -Xms10m 设置堆大小为10m

控制台打印

根据控制台的打印可以发现在多线程的情况下,如果某个线程导致了OOM,虚拟机会终止该线程并回收它所占用的资源。但是,如果OOM是由于整个应用程序使用的内存超过了虚拟机的最大内存限制而导致的,那么整个虚拟机将会崩溃。

即当应用程序使用的内存超过了虚拟机的最大内存限制时,虚拟机会抛出OutOfMemoryError异常。如果该异常没有被捕获并处理,那么虚拟机将会崩溃,并且应用程序将无法继续执行。

因此,在编写多线程应用程序时,需要注意内存的使用情况,并且及时处理OutOfMemoryError异常,以避免整个虚拟机崩溃。
在这里插入图片描述
这个就好像是操作系统的资源分配一样,如果出现了资源的长时间持有,导致了可能死锁的发生,就允许剥夺该线程资源进行资源重分配。

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

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

相关文章

24考研数据结构-线性表3

目录 2.4 线性表的链式表示2.4.0 引入的原因2.4.1 单链表的定义 2.4.2 单链表的两种实现形式2.4.2.1 不带头结点的单链表2.4.2.2 带头结点的单链表2.4.2.3知识回顾与重要考点2.4.3.1 带头结点的单链表按位序插入节点2.4.3.2 单链表的插入节点的时间复杂度2.4.3.3 不带头结点的单…

Ceph网络模型

Ceph网络模型 Ceph 生产环境中一般分为两个网段公有网络: 用于用户的数据通信集群网络: 用于集群内部的管理通信

mac m1 触控栏TouchBar功能栏异常

电脑可能在高温下运行时间过长&#xff0c;导致TouchBar之前正常显示的调整屏幕亮度与调整声音等功能的按钮均丢失&#xff0c;然后看了一眼键盘设置&#xff0c;设置也是正常的&#xff0c;已勾选显示功能栏 下面请看 如何在MacBook Pro&#xff08;macOS Monterey&#xff0…

2023年深圳杯数学建模赛题浅析

由于今明两日由于一些不可避免的事情&#xff0c;这里仅仅先给大家简单写一个赛题浅析&#xff0c;详细过程步骤思路以及讲解视频预计后天发布 A题 影响城市居民身体健康的因素分析 A题以慢性病为命题背景&#xff0c;给出数据以及题目初步来看来看为一个数据处理数据分析的综…

elasticsearch查询操作(DSL语句方式)

说明&#xff1a;本文介绍在kibana&#xff0c;es的可视化界面上对文档的查询操作&#xff1b; 添加数据 先使用API&#xff0c;创建索引库&#xff0c;并且把数据从MySQL中查出来&#xff0c;传到ES上&#xff0c;参考&#xff08;http://t.csdn.cn/NaTHg&#xff09; 索引库…

Ceph部署方法介绍

Ceph部署方法介绍 Installing Ceph — Ceph Documentation Ceph环境规划 admin是一个部署节点

Centos7 扩容(LVM 和非 LVM)

一、磁盘扩容方式 CentOS 系统的磁盘扩容可以分为两种方式&#xff1a;LVM 管理和非 LVM 管理。 LVM 管理的分区和传统分区方式是可以共存的。在同一个系统中&#xff0c;你可以同时使用 LVM 管理的分区和传统分区。 例如&#xff0c;在 CentOS 系统中&#xff0c;你可以选择将…

《重构的时机和方法》书籍推荐

《重构的时机和方法》是一本由克里斯蒂安克劳森(Christian Clausen)所著&#xff08;郭涛翻译&#xff09;的软件工程经典之作。本书全面介绍了重构的概念、原则和方法&#xff0c;为软件开发者提供了一系列宝贵的指导和实践经验。在这篇书评文章中&#xff0c;我将从内容、实用…

Linux环境安装Tomcat

在tomcat官网(下载路径)下载好tomcat压缩包 上传服务器压缩到/usr/tomcat目录下 tar -zxvf xxx.tar.gz 配置tomcat环境变量 export CATALINA_HOME/usr/tomcat/apache-tomcat-8.5.56 export CATALINE_BASE/usr/tomcat/apache-tomcat-8.5.56 export PATH$PATH:$CATALINA_BASE/bi…

阿克曼转向模型介绍

阿克曼转向模型介绍 目录 阿克曼转向模型介绍是什么&#xff1f;基本原理应用与改进 是什么&#xff1f; 阿克曼转向是一种现代汽车的转向方式&#xff0c;在汽车转弯的时候&#xff0c;内外轮转过的角度不一样&#xff0c;内侧轮胎转弯半径小于外侧轮胎。 它描述了汽车转向系…

Spring中如何用注解方式存取JavaBean?有几种注入方式?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 本篇文章将讲解如何在spring中使用注解的方式来存取Bean对象&#xff0c;spring提供了多种注入对象的方式&#xff0c;常见的注入方式包括 构造函数注入&#xff0c;Setter 方法注入和属性…

TypeError: can‘t convert np.ndarray of type numpy.object_.

在处理数据集的时候出现报错&#xff1a; TypeError: can’t convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool. train_labels torch.tensor(train…

手机怎么压缩pdf?这种压缩方法简单易用

手机怎么压缩pdf&#xff1f;PDF文件是我们生活和工作中常用的一种文档格式&#xff0c;但是有时候PDF文件的大小会很大&#xff0c;不方便发送和存储。那么&#xff0c;如何在手机上压缩PDF文件呢&#xff1f;下面就给大家介绍一种简单好用的压缩方法。 今天要给大家介绍的这款…

甘特图的发展史

目录 背景: 过程: 总结&#xff1a; 背景: 1910年代初为了管理工程项目的进度而创造了甘特图。 1917年&#xff0c;美国工程师亨利甘特(Henry Laurence Gantt)首次提出了甘特图的概念。他是一位工程师和管理学家&#xff0c;设计了一种图表&#xff0c;用于显示进度成产仅度…

毕业生求职招聘网站的设计与实现JAVA(SpringBoot+VUE+Mysql)

由SpringBootVUEMysql实现的网站的设计 功能模块 设计思路&#xff1a;主要分为管理员、毕业生、招聘企业三大身份模块 首先是登录界面 注册界面 其次就是公共页面 公共页面又分为首页、空中宣讲会、招聘岗位、求职信息、论坛信息、试卷列表、招聘资讯、个人中心和后台管理、…

【原创】内网穿透案例

案列一&#xff08;Frp内网渗透&#xff09; 大概图列网上随便找的&#xff0c;路线是这个样子 这里选用ctfshow的一道命令执行题 由Frp实现内网访问及扫描 1.传入一句话&#xff0c;上线蚁剑http://b85fdf24-b98e-4810-9e76-a038a8987630.challenge.ctf.show:8080/?cecho…

C语言--位段

C语言—位段 文章目录 C语言---位段一、位段是什么&#xff1f;二、位段的内存分配三&#xff0c;位段的跨平台问题四&#xff0c;位段的应用 一、位段是什么&#xff1f; 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 位段的成员必须是 int、unsigned int 或…

代码随想录day12 | [前、中、后、层]二叉树的遍历迭代法和递归法

文章目录 一、前后中序递归法二、前后序迭代法三、中序遍历迭代法四、层序遍历 递归三部曲&#xff1a; 1️⃣ 第一步确定递归函数的返回值和参数 2️⃣第二步确定递归的终止条件 3️⃣第三步确定单层递归处理的逻辑 一、前后中序递归法 前序遍历二叉树 class Solution { pr…

vue三级路由的写法

{path: "/trafficmanagement",component: Layout,redirect: "/trafficmanagement",alwaysShow: true,meta: {title: "通行模块",icon: "excel",},children: [{path: "carline",name: "carline",alwaysShow: true,…

数据结构day8(2023.7.25)

一、排序算法 排序&#xff1a;把无需序列转换为有序序列的一种算法。 内排&#xff1a;在计算机内存中实现的排序算法【多用适用于数据量较小的情况】 外排&#xff1a;在计算机内存以及外部介质实现的排序算法【先内存&#xff0c;在外部】 排序的分类&#xff1a; 交换排…