优化:服务队列堵塞,内存不足,CPU打满导致宕机,服务卡死

一.事件:刚接手的项目因消息队列堵塞频繁报警,交接的时候原负责人说项目是最近出现的问题,暂时无法解决,只能靠重启解决;

二.排查:因公司用的是jre,也没有其他第三方工具,只能按照经验去逐步去分析。分析处理过程:使用线程池方式异步处理消息队列堵塞问题后,又发现CPU100%导致服务器直接卡死,正常情况下系统会根据系统资源限制来强杀掉进程,经过ulimit发现栈大小限制size直接是机器内存,修正后又出现cpu打满导致服务宕机,继续排查发现主要是因为内存不足,频繁GC导致的,因此确定优化的方向是内存。

三.优化点

1.优化系统资源限制:服务资源用尽卡死,使用ulimit命令查看资源限制,发现设置栈大小过大可能导致内存不足,cpu打满的情况下系统不会杀掉进程,直接卡死,因此设置栈大小为8MB(默认);stack size (kbytes, -s):栈大小限制,即一个进程可以使用的栈空间大小。

      注意点:(1)栈大小过大可能会导致资源浪费、性能下降、栈溢出风险、系统稳定性问题、安全风险如缓冲区溢出攻击;

                      (2)栈大小过小可能导致StackOverflowError。

2.JVM参数调优:服务内存达到最大,频繁触发gc运行导致cpu飙高,调优参数如下:

-Xms 初始堆内存大小,-Xmx最大堆内存,

GC:-XX:+UseG1GC使用G1垃圾收集器,-XX:MaxGCPauseMillis=100最多暂停时间 

-XX:InitiatingHeapOccupancyPercent=45触发GC的堆占用百分比

开启GC日志:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/gc.log

JVM遇到OutOfMemoryError错误时,自动生成堆转储文件:-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=./gclogs/dump;

3.统一使用全局单例线程池:项目中在方法中创建线程池,导致每次请求都会创建线程池,虽然创建线程池本身并不会直接占用CPU资源,而且占用内存以及线程管理开销也很小,但是请求量很大时,也将会迅速消耗系统资源,并且线程池中的线程执行任务时会产生CPU占用,统一使用全局线程池,合理配置线程池大小,可以确保系统资源的有效利用;请求消息队列放入线程池中处理,实现异步响应;

4.优化静态对象:项目中使用了比较多的静态集合,如hashmap,而且还有定时任务写入,整理业务 逻辑,调整cron,并进行clear(),注意clear只是清空了集合中的元素,但不会改变其容量或内存占用,因此,如果想要确保旧的集合实例占用内存被释放,可以把集合置为null,这样就的实例就没有任何引用,垃圾收集器就可以回收,然后重新创建新的实例,重新根据当前的需求分配内存空间。

四.主要原因:项目中有个定时任务每半小时获取大概14万新闻,并且是增量获取到内存,项目中对这些数据还进行了大量复杂计算,最近新闻突增了三四倍,增量到内存,导致内存不足。

五.其他

1.JDK8的ConcurrentHashMap也会造成CPU 100%

原来,JDK8的ConcurrentHashMap也会造成CPU 100%

JDK8下,触发computeIfAbsent的BUG,会造成CPU100% · Issue #2294 · alibaba/spring-cloud-alibaba · GitHub

2.JDK自带工具

https://blog.51cto.com/u_12204/6843813

jps:查看本机java进程信息

jstack:打印线程的栈信息,制作 线程dump文件

jmap:打印内存映射信息,制作 堆dump文件

jstat:性能监控工具

jhat:内存分析工具,用于解析堆dump文件并以适合人阅读的方式展示出来

jconsole:简易的JVM可视化工具

jvisualvm:功能更强大的JVM可视化工具

javap:查看字节码
 

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

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

相关文章

自杀行为的神经生物学认识

自杀行为的神经生物学认识 编译 李升伟 隐藏在自杀行为背后的大脑生化机制正引领人类对自杀的认识从黑暗步入光明。科学家希望未来这些机制能带来更好的治疗和预防策略。 基斯 • 范希林根(Cornelis Van Heeringen)第一次遇见瓦莱丽( Va…

大模型技术工程师:抓住时代机遇,成为行业精英_

伴随AI大模型的火热,中国科技大厂们正在掀起一场「跑步AI化」的风暴。从顶层战略到业务线重构,AI无疑已成为大厂们押注未来的新故事。 大模型时代已经到来 大模型已成为全球竞争热点,一个大模型时代已经到来。 大模型具备三个特点&#xf…

MySQL:概念、逻辑与物理结构设计详解

MySQL:概念、逻辑与物理结构设计详解 一、引言 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于各种规模和类型的应用程序中。在设计和实现一个MySQL数据库时,理解其基本概念、逻辑结构设计和物理结构…

新手一次学会SpringBoot项目部署 + Docker中运行Samba服务设置共享目录

SpringBoot项目部署 1.IDEA打包,在IDEA终端,输入mvn clean package 2.将项目target中的jar包放入linux目录 3.运行jar包 前台运行(直接显示输出): java -jar data-transport-server-0.0.1-SNAPSHOT.jar后台运行&…

java创建线程

在Java中创建线程可以通过继承Thread类或者实现Runnable接口。以下是两种方式的示例代码: 继承Thread类 public class MyThread extends Thread { public void run() { System.out.println("线程正在运行..."); } } public class Main {…

鸿蒙开发网络管理:【@ohos.net.socket (Socket连接)】

Socket连接 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import socket from ohos.net.socket;socket.constructUDPSocketInstance constructUDPSocketInstance(): UDPSocket 创建…

已解决:geecg Column ‘id‘ in order clause is ambiguous

报错:Column id in order clause is ambiguous; MyBatis关联查询,相同字段名冲突,sql语句已经使用别名但仍然报错。 分析:写mapper映射文件时,在写到一对一关联,一对多关联时,由于两…

从11个视角看全球Rust程序员4/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 8 Rust程序员最喜欢用什么工具调试程序? 用println!或dbg!宏来调试一下 2022年:55%2023年:55%在IDE里玩玩UI调试 2022年:27%2023年:29%在控制台里调试调试 2022年:11%2023年:10%不调试,任性 2022年:5%2023年:6%有其他奇思妙想 2022年:1%…

骁龙662_高通SM6115主要参数_高通模块方案定制

骁龙662(SM6115)采用了全新的44 Kryo 260 CPU架构,由四核Cortex-A73(高达2.0 GHz)和四核Cortex-A53(高达1.8 GHz)组成。这种架构的设计使得骁龙662在性能上相较于上一代产品有了显著的提升,为用户提供了更快的运行速度和更流畅的使…

安卓TextView控件实现下划线

效果展示 这里需要使用到LayerDrawable&#xff0c;对应于<layer-list>标签。在drawable目录下新建一个text_underline.xml文件&#xff0c;text_underline.xml的代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <layer-lis…

TS安装及JS转换

第一步&#xff1a;先安装好node.js&#xff0c;可以在官方下载或我们提供压缩包直接安装好node.js Node.js的官方网站是下载 | Node.js 中文网 下载对应系统的版本。我们提供是64位。安装好后调出dos命名&#xff0c;输入 npm确认下有没有安装好。 第二步&#xff1a;安装cnpm…

机器学习笔记——无监督学习下的k均值聚类

k均值聚类算法原理 目标是将样本分类 原理&#xff1a;首先随机选择k何点作为中心&#xff0c;然后计算每一个点到中心的聚类&#xff0c;然后计算到每个中心的距离&#xff0c;选择到中心最短距离的那个中心所在的类进行归类&#xff0c;然后更新中心点&#xff0c;一直重复。…

vivado PKGPIN_NIBBLE

描述 PKGPIN_NIBBLE是PKGPIN_BYTEGROUP的一部分。参见PKGPIN_BYTEGROUP&#xff0c; 第122页了解该对象的描述。 相关对象 PKGPIN_BYTEGROUP和PKGPIN_NIBBLE与IO_BANK、PACKAGE_PIN和 PORT&#xff0c;如前所述。此外&#xff0c;每个PKGPIN_NIBBLE都与 Xilinx设备。您可以使用…

【触想智能】工业显示器定制时需要注意的重点问题

随着工业自动化的不断发展&#xff0c;工业显示器越来越重要。不同于普通的娱乐和商业应用&#xff0c;工业显示器需要更加耐用、可靠、安全&#xff0c;并且满足特定的工业环境和应用需求。 因此&#xff0c;仔细考虑和选择适合自己的工业显示器至关重要。本文将介绍一些您在进…

React 中的 ErrorBoundary

在 React 中&#xff0c;如果不做任何控制&#xff0c;当组件出现异常时&#xff0c;React 渲染就会停止&#xff0c;页面出现白屏&#xff0c;这种体验很不好。例如当用户输入某些非法数据&#xff0c;而前端都没有进行校验&#xff0c;页面出现白屏。这种情况下&#xff0c;最…

CUDA C权威编程指南 第4章 全局内存

一、CUDA内存模型概述 1. CUDA内存模型 对于程序员来说&#xff0c;一般有两种类型的存储器&#xff1a; 可编程的&#xff1a;你需要显式地控制哪些数据存放在可编程内存中 不可编程的&#xff1a;你不能决定数据的存放位置&#xff0c;程序将自动生成存放位置以获得良好…

游戏开发中的坑之十四 photoshop的javascript脚本批量修改分辨率

原因&#xff1a;美术提交大量2048x2048的贴图&#xff0c;导致工程臃肿。 方案&#xff1a;使用photoshop的javascript脚本批量把指定的文件夹以及所有子文件夹的贴图进行压缩。 脚本中指定针对2048x2048的贴图进行处理。 // Photoshop JavaScript to resize TGA images with…

医药集团数据治理-医药企业如何实现数字化转型

康恩贝是一家集药品研发、生产、销售及药材种植为一体的医药上市企业。业务范围包括投资和实业经营&#xff0c;涉足的产业涵盖多个领域&#xff0c;已经形成了以医药产业为主业&#xff0c;生态农业、保健食品、环保产业为辅的产业体系&#xff0c;集团销售规模逾百亿&#xf…

基于SpringBoot+Vue会所产后护理系统设计和实现

基于SpringBootVue会所产后护理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

179海关接口源码,跨境报关商城+多平台搭建+多终端支持

在跨境贸易中&#xff0c;报关是一个非常重要的环节。而179海关接口源码提供了一种方便快捷的方式来实现跨境报关的功能。它还支持多平台搭建和多终端支持&#xff0c;让整个报关流程更加高效和便捷。 1. 179海关接口源码的功能 179海关接口源码提供了多种功能&#xff0c;其…