交易系统JVM内存优化

news2024/11/14 13:40:06

背景

新交易系统上线以后,业务指标(成单率)和系统指标(CPU、QPS、JVM内存)是我们重点关注的指标。

CPU较高:可以通过Arthas等工具查看繁忙线程的堆栈信息,定位具体的代码,具体分析。

QPS较高:首先评估一下,流量是否正常,正常的流量可以适当扩容,异常的流量适当调整限流的阈值。

本篇我们主要针对JVM内存进行分析和处理。

交易系统配置:JDK8、4C8G、垃圾回收器(PreNew + CMS)

关注点

  1. 元空间
  2. 老年代
  3. 年轻代
    在这里插入图片描述

元空间

系统上线一段时间之后,查看监控,元空间的内存比率已经逼近告警阈值(70%)。

对线上某一台机器的元空间内存快照数据进行逐一分析,发现元空间里面存在大量无用的类模版信息。

排查后发现,这些无用类的信息主要由两部分组成:

  1. 项目初建时,引入了大量的无用二方包。
  2. 项目初建时,引入了大量的无用工具类。

经过一个星期的梳理,将这些无用类一一剔除掉,因为代码改动量比较大,所以在预发环境观察了一个星期,经过QA团队进行了全case覆盖测试,如期上线。

上线后,效果显著,元空间内存比率从68%降低至50%。

但是随着上线之后,发现元空间的内存有呈线性趋势增长的形势。

于是,又仔细分析了元空间的快照数据,分析发现有很多Guava Aviator相关的类,于是又深挖了一遍这个组件的源码。

Guava Aviator在系统中,主要是做为规则引擎,具体用来做系统商级别的产品限购校验。

Guava Aviator底层用了ASM技术,每次执行该组件编译API接口的时候,都会动态创建一个类,这也就解释了为什么随着系统上线之后,Guava Aviator相关的类越来越多。

那有没有什么解决办法呢?有,Guava Aviator内部做了缓存机制,可以通过配置,使用该组件的缓存功能,这样就避免了每次都重新编译对象,创建新类。

老年代

经过分析老年代内存的快照数据,发现有两大对象:产品信息和合约信息。

产品信息:交易系统每次收单需要记录产品相关的信息。
合约信息:交易系统定位为B端交易系统,所以会和分销商和系统商进行合同签约。

产品中心和合约中心给域内提供的接口,返回的都是全量数据,数据量不仅庞大,而且接口性能还比较差,最高rt可达800ms。

这一部分数据超过1m,会直接存进老年代。

我这里的处理方案是针对产品查询接口增加客户端缓存,同时推动产品中心增加服务端缓存,当然这里还需要考虑缓存的时效性,因为在节假日的时候,产品的生命周期比较短,价库变动可能比较频繁,一不小心可能会造成资损,所以如果做客户端缓存,可以让产品中心在产品发生变动的时候,发送一个产品数据变更事件,交易系统监听该事件,进而失效缓存。

关于合约数据,变动不会特别频繁,缓存一天即可,可以让合约中心在合约发生变更的时候,发送一个合约数据变更事件,交易系统监听该事件,进而失效缓存。

当然,也可以针对垃圾回收器做一些设置,比如调高数据进入老年代的阈值(1m配置成2m),调大年轻代比例等。

在分析老年代的快照数据时,又发现了Guava aviator相关的数据信息。我们开启Guava aviator的缓存功能的时候,组件内存用ThreadLocal缓存了编译之后的对象,但是没有显示remove,因为项目中用的都是线程池,针对ThreadLocal内部的Entry对象是强引用,导致内存泄漏。

这里有两个方案:

  1. 根据Aviator官方所述,升级版本即可,高版本fix了这个bug。
  2. 编译对象缓存在本地,可使用LRU算法,做容量控制。

年轻代

针对年轻代,有些时候会发生一些频繁的Young GC,但是抓了快照信息,并没有发现什么问题。

这里可以调整年轻代的内存比率。

当时也想升级垃圾回收器为G1,因为G1的数据结构都是一个一个Region,内部有优先级队列可以控制GC响应时间,而且还是整堆回收,性能相对来说要优于PreNew+CMS这一套垃圾回收器。这里主要考虑的是交易系统的稳定性,升级垃圾回收器算是比较大的改动,而且目前使用CMS并没有太大问题,就放弃了这个方案。

最后,采取的方案就是将4C8G的配置,升级为了4C12G的配置,效果显著。

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

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

相关文章

谷歌浏览器字体模糊不清怎么办

许多小伙伴在使用谷歌浏览器时,可能都遇见过字体模糊不清的情况,这将对我们的浏览体验大打折扣。为了解决这以问题,本文将为大家带来谷歌浏览器字体模糊不清的解决方法,帮助你享受到更清晰舒适的阅读环境。(本文由chro…

聚星文社AI工具官方

聚星文社是一键AI推文生成工具超强功能极速版介绍聚星文社AI工具官方https://docs.qq.com/doc/DRU1vcUZlanBKR2xy 同时集成原创和反推搬运功能 并可一键切换MJ或SD进行批量出库 一键自动智能分镜或手动快速分镜 精准排布镜头功能全预设 超简化流程 3秒即可完成参数配置全网最全…

Java 并发(五)—— 线程池

线程池核心参数?(核心线程数、最大线程数、任务队列)线程池构造方法中除了保存参数以外还要做什么事?(设置线程工厂、任务拒绝策略)提交任务时线程池要做什么?(任务执行机制&#xf…

Golang Map 深度剖析:原理、实践与面试要点

嘿,小伙伴们!我是 k 哥。今天,咱们来聊聊 Map 。 在 Go 语言这个神奇的世界里,Map 这个有点神秘的数据结构一直都是开发者们特别关注的。 你是不是在用 Map 的时候,对它里面咋工作的感到好奇?是不是碰到复杂操作的时候,特别想弄明白它背后的原理?别着急,今天这篇文章…

Java流程控制06:嵌套for循环

本节教学视频链接:https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中,‌嵌套for循环是指将…

使用三菱PLC源码进行PLC读取写入操作

安装 MX Component 。 我的安装地址在: 打开 utl 文件夹下的 Communication Settings Utility 执行。 配置PLC 添加当前需要配置的PLC 注意 logical station Namber 就是程序里需要对接的逻辑站点编号 5.配置选择对应的COM操作选择对应的cpu型型号,…

Ah That‘s Hawt

目录 一、题目 二、思路 三、payload 3.1 方案一 3.1 方案二 四、思考与总结 一、题目 <!-- Challenge --> <h2 id"will"></h2> <script>smith (new URL(location).searchParams.get(markassbrownlee) || "Ah Thats Hawt")sm…

甄选系列“论软件开发过程RUP及其应用”,软考高级论文,系统架构设计师论文

论文真题 RUP(Rational Unified Process)是IBM公司的一款软件开发过程产品,它提出了一整套以UML为基础的开发准则,用以指导软件开发人员以UML为基础进行软件开发。RUP汲取了各种面向对象分析与设计方法的精华,提供了一个普遍的软件过程框架,可以适应不同的软件系统、应用…

ant -design 框架以及具体调试

1.介绍 Ant-Design-Vue 是一个基于 Ant Design 设计体系的 Vue 实现。Ant Design 是由阿里巴巴开源的一个企业级 UI 设计语言&#xff0c;旨在提升用户体验和开发效率。Ant-Design-Vue 将 Ant Design 的设计理念和组件库带入了 Vue 生态系统&#xff0c;使得开发者能够在 Vue …

RabbitMQ集群 - 普通集群搭建、宕机情况

文章目录 RabbitMQ 普通集群概述集群搭建数据准备启动容器宕机情况 RabbitMQ 普通集群 概述 1&#xff09;普通模式中所有节点没有主从之分&#xff0c;所有节点的元数据&#xff08;交换机、队列、绑定等&#xff09;都是一致的. 例如只要有任意一个节点上面 新增交换机&…

迈出Python自动化测试的第一步

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率 性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能自…

C++竞赛初阶L1-12-第五单元-while(27~28课)531: T456440 含 k 个 3 的数

题目内容 输入两个正整数 m 和 k&#xff0c;其中 1<m≤1015&#xff0c;1<k≤15 &#xff0c;判断 m 是否恰好含有 k 个 3&#xff0c;如果满足条件&#xff0c;则输出 YES&#xff0c;否则&#xff0c;输出 NO。 输入格式 输入一行&#xff0c;为两个整数 m,k&#x…

【js面试题】js原型,原型链?有什么特点

在 JavaScript 中&#xff0c;原型&#xff08;Prototype&#xff09;和原型链&#xff08;Prototype Chain&#xff09;是实现继承和共享属性与方法的核心机制。理解它们对于深入掌握 JavaScript 的对象模型非常重要。 原型&#xff08;Prototype&#xff09; 每个 JavaScri…

24年上半年天融信营收缩减1.8亿,亏损2.06亿

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

建筑三剑客:平面、剖面与立面图解析

平面图、剖面图与立面图是建筑学中不可或缺的工具&#xff0c;它们共同构成了建筑设计的基础。平面图展示了建筑物的顶部视图&#xff0c;详细标出了房间布局和空间关系。剖面图则揭示了建筑的内部结构&#xff0c;包括楼层分布和垂直交通。而立面图呈现了建筑的外观&#xff0…

【学习笔记】Matlab和python双语言的学习(一元线性回归)

文章目录 前言一、一元线性回归回归分析的一般步骤一元线性回归的基本形式回归方程参数的最小二乘法估计对回归方程的各种检验估计标准误差的计算回归直线的拟合优度判定系数显著性检验 二、示例三、代码实现----Matlab四、代码实现----python回归系数的置信区间公式残差的置信…

入门MySQL数据库

目录 一、MySQL的安装&#xff08;以5.7版本为例&#xff09; 1. 一路默认安装即可&#xff0c;注意root密码。 2.配置环境变量 3.登录数据库 二、指令 1.数据库 2.数据表 3.约束 4.增删改查 1>查 2>增 3>改 4>删 5.数据库用户 6.外键 1>创建添加外…

实验5:数码管实验,51单片机

8个数码管 LED1-LED8分别有P22,P23,P24的A,B,C控制 C B A 000 0-1 001 1-2 010 2-3 011 3-4 101 4-5 110 6-7 111 7-8 共阴极数码管,八段 0-F编码 硬件图 对应P0口 main.c #include<reg52.h>typedef unsigned int u16; typedef unsigned char u8;#d…

RPA在政务领域的发展前景

随着信息技术的迅猛发展&#xff0c;政务领域也在不断探索创新&#xff0c;以提升政府服务的质量和效率。RPA作为一种自动化技术&#xff0c;打破了传统政务服务人工操作的局限&#xff0c;协助基层人员更高效准确地完成录入、审查、校对和数据汇总等各项繁琐的工作&#xff0c…

第1节 安装Flask

我们以Thonny4为例&#xff1a; flask是第一个第三方库。与其他模块一样&#xff0c;安装时可以直接使用python的pip命令实现。 一、找到你的安装目录 这是我的安装目录&#xff1a; D:\thonney4\scripts 二、执行pip pip install Flask