使用Java分析器优化代码性能,解决OOM问题

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址


背景

最近我一直在做性能优化,对一个单机应用做性能优化。主要是涉及到解析和导入导出相关的业务。

大致说一下这个单机应用干嘛的:制作票样,类似于答题卡。发给某些人填写,然后通过单机python图像识别存到数据库里面,在我们单机平台进行各种分析汇总数据。

前面呢已经优化了两块,一个是解析(目前性能提升了8倍,后续再优化),一个是汇总(性能提升了10倍+,后续再优化)。

写这个呢是因为有个服务在大数据量的时候总是OOM,实在是头疼呀,只能搞内存分析了,做内存分析有很多主要软件。。我这里呢不折腾,就用Idea自带的,个人觉得宇宙无敌啊。

实际业务呢,是需要实现一个功能,一键换机。我的实现思路呢是通过导出sql文件,然后另一台机子导入sql文件。

这里数据量实在是太大,主要是图片数据太大,因为历史表设计问题,所以图片是直接存储到数据库的。

我们是一个批次为一组,一个批次下面有多家单位,一个单位下面可能会有数千条数据,每条数据都有一张图片,大部分图片大小在200k左右。

另一个受限点是,实际运行程序的单机内存只有4g的样子,非常小。

一家单位导出来的数据量大概是2个多G

如何使用

在试图>工具窗口下面有一个分析器,点开它

如果你的idea没有该功能,请升级最新版

alt

然后我们正常启动项目

项目起来后,这边会刷出启动的进程,然后我们需要附加Profile

alt

这里显示正在分析那就没问题了,我们去网站上执行导出操作

alt

实时查看CPU和堆内存

这里能看到这种情况是因为,我优化了一下,在每次处理完之后就手动GC一下,如果不手动GC大概处理三轮就OOM了

这个也是我已经优化后的一种手段,后续我打算调高每次批量处理的阈值,提高单次处理效率

alt

我们点击停止分析,就能看到下面的页面

分析结果

火焰图

火焰图(Flame graph)是一种可视化工具,用于分析和优化软件的性能。它以图形的形式展示了程序在执行过程中各个函数的调用关系和耗时情况。

火焰图的横轴表示程序的执行时间,纵轴表示函数调用栈。每个函数在火焰图中以一个矩形表示,矩形的宽度表示函数在执行过程中所占用的时间比例,矩形的高度表示函数的调用深度。通过火焰图,我们可以直观地看到程序中哪些函数占用了大量的时间,从而帮助我们找到性能瓶颈和优化的方向。

要生成火焰图,通常需要使用性能分析工具来采集程序的执行数据。常用的性能分析工具包括Linux下的perf、Java应用程序中的Java Flight Recorder(JFR)和Java VisualVM等。这些工具可以记录程序的函数调用信息和耗时情况,并生成火焰图。

生成火焰图后,我们可以通过观察火焰图中的热点函数(即占用时间较多的函数)来进行性能优化。可以考虑对热点函数进行代码优化、算法优化、并发优化等,以提高程序的性能和响应速度。

alt

调用树

调用树(Call Tree)是一种可视化工具,用于展示程序在执行过程中函数之间的调用关系。它以树状结构的形式展示了函数的调用层次和调用次数。 在调用树中,根节点表示程序的入口函数,每个子节点表示一个被调用的函数。通过观察调用树,我们可以了解函数之间的调用流程,找到函数的调用路径和调用次数,从而帮助我们分析程序的执行逻辑和性能瓶颈。 调用树通常会显示每个函数的调用次数和总耗时。这样我们可以快速识别出调用次数较多或耗时较长的函数,从而找到可能的性能问题和优化的方向。

alt

方法列表

alt

时间线

alt

事件

alt

分析

这些图吧,看着也不麻烦,揣摩下也大概能知道干嘛的,我举个例子

在调用树视图中,我们一直点下去,看到下面这个方法,占用了33.8%时间啊,这不得赶紧优化一下

alt
    private String bytesToHexString(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }

那我后面就把这块代码重构下就行,优化过程大致就是这样啦,大家掌握方法就好

后记

如果你想了解使用Xrebel优化接口性能,可以看看这篇文章:http://blog.zysicyj.top/db82e5f2 我前两天写了优化解析接口性能的,可以看看这篇文章:http://blog.zysicyj.top/a384b09f

本文由 mdnice 多平台发布

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

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

相关文章

关系型数据库和非关系型数据库

关系型数据库是以关系(表格)为基础的数据库,它采用了 SQL(Structured Query Language)作为数据操作语言,常见的关系型数据库包括 MySQL、Oracle、SQL Server 等。 非关系型数据库则是基于文档、键值、列族…

深度优先搜索(dfs)--矩阵部分-leetcode以及常见题

介绍 深度优先搜索(Depth-First Search,DFS)是一种常用的图搜索算法,它用于查找图或树数据结构中的路径或解决问题。下面是深度优先搜索的常见步骤以及一个示例问题: 深度优先搜索的常见步骤: 选择起始节…

如何手动读取 GLTF/GLB 文件

推荐:使用NSDT场景编辑器快速搭建3D应用场景 文件类型 GLTF文件有两种不同的主要文件类型:.gltf和.glb。 GLTF文件本质上只是一个重新命名的json文件,它们通常与包含顶点数据等内容的.bin文件相提并论,但这些内容也可以直接包含…

分布式实时仿真系统-反射内存的应用

为了使分布式实时仿真系统(一个典型代表就行飞行模拟器)达到逼真的仿真效果,在系统内部,往往不仅需要对各种数据模型进行实时解算,而且需要一个延迟时间极低的确定性网络在系统之间传递数据,这样才能让各个子系统之间协调一致地工…

问道管理:分时高抛低吸策略?

分时高抛低吸是股市中的一种买卖战略,也是投资者经常运用的一种方法。这种战略经过剖析图表、股价和时刻,尽可能减少危险,添加收益。下面从多个视点对十二种分时高抛低吸进行剖析。 视点一:什么是分时高抛低吸? 分时高…

报错:为什么数组明明有内容但打印的length是0

文章目录 一、问题二、分析三、解决1.将异步改为同步2.设置延迟 一、问题 在日常开发中,for 循环遍历调用接口,并将接口返回的值进行拼接,即push到一个新的数组中,但是在for循环内部是可以拿到这个新的数组,而for循环…

人工智能的优势:使用 GPT 和扩散模型生成图像

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 世界被人工智能 (AI) 所吸引,尤其是自然语言处理 (NLP) 和生成 AI 的最新进展,这是有充分理由的。这些突破性技术有可能提高各种任务的日常生产力。…

Unity的GPUSkinning进一步介绍

大家好,我是阿赵。   在几年前,我曾经写过一篇介绍GPUSkinning的文章,这么多年之后,还是看到不停有朋友在翻看这篇旧文章。今天上去GitHub看了一下,GPUSkinning这个开源的插件已经很久没有更新过了,还是停…

云原生Kubernetes:kubectl管理命令

目录 一、理论 1.kubectl 管理命令 2.项目的生命周期 二、实验 1.kubectl 管理命令 2.项目的生命周期 三、总结 一、理论 1.kubectl 管理命令 (1)陈述式资源管理方法 kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口…

复旦-华盛顿EMBA:AI时代掘金,科技进化里的挑战与机遇

如果从去年年底ChatGPT3.5发布算起,AI赛道的热度已经持续飙升了半年有余。      “AI的iPhone时刻”代表什么?AI驱动的商业时代已经到来?      我们能看到担忧、恐惧、憧憬,但唯独不缺狂飙突进、加速进化。人类制造AI&…

WordPress(4)关于网站的背景图片更换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、更改的位置1. 红色区域是要更换的随机的图片二、替换图片位置三.开启随机数量四.结束前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也…

Hadoop的分布式文件存储系统HDFS组件的使用

Hadoop的第一个核心组件:HDFS(分布式文件存储系统) 一、HDFS的组成1、NameNode2、DataNode3、SecondaryNameNode4、客户端:命令行/Java API 二、HDFS的基本使用1、命令行操作2、Java API操作 三、HDFS的工作流程问题(H…

Direct3D颜色

在Direct3D中颜色用RGB三元组来表示,RGB数据可用俩种不同的结构来保存,第一种是D3DCOLOR,它实际上与DWORD类型完全相同,共有32位,D3DCOLOR类型种的各位被分成四个8位项,每项存储了一种颜色分量的亮度值。 由…

【Hive SQL 每日一题】统计用户连续下单的日期区间

文章目录 测试数据需求说明需求实现 测试数据 create table test(user_id string,order_date string);INSERT INTO test(user_id, order_date) VALUES(101, 2021-09-21),(101, 2021-09-22),(101, 2021-09-23),(101, 2021-09-27),(101, 2021-09-28),(101, 2021-09-29),(101, 20…

C语言sizeof()计算空间大小为8的问题

在练习数据结构过程中&#xff0c;定义指针p&#xff0c;并且申请了10个char类型空间&#xff0c;但在计算p所指空间大小时候&#xff0c;发现了一些奇怪的现象。 #include <stdio.h> #include <stdlib.h>int main(){char s[12];printf("the size of memory …

Java反射:探索对象创建与类信息获取

文章目录 1. 对象的创建2. 类的初始化2.1 类的加载2.2 类的连接2.3 类的初始化 3. 反射是什么&#xff1f;4. 获取Class类对象4.1 使用类名.class4.2 使用对象的getClass()方法4.3 使用Class.forName() 5. 获取构造器对象5.1 使用getConstructors()和getDeclaredConstructors()…

pytorch代码实现之空间通道重组卷积SCConv

空间通道重组卷积SCConv 空间通道重组卷积SCConv&#xff0c;全称Spatial and Channel Reconstruction Convolution&#xff0c;CPR2023年提出&#xff0c;可以即插即用&#xff0c;能够在减少参数的同时提升性能的模块。其核心思想是希望能够实现减少特征冗余从而提高算法的效…

【探索Linux】—— 强大的命令行工具 P.8(进程优先级、环境变量)

阅读导航 前言一、进程优先级1. 优先级概念2. Linux查看系统进程3. PRI&#xff08;Priority&#xff09;和NI&#xff08;Nice&#xff09; 二、环境变量1. 概念2. 查看环境变量方法3. 环境变量的组织方式4.通过代码获取环境变量5. 环境变量的特点 总结温馨提示 前言 前面我们…

C++ - 多态的实现原理

前言 本博客主要介绍C 当中 多态语法的实现原理&#xff0c;如果有对 多态语法 有疑问的&#xff0c;请看下面这篇博客&#xff1a; 探究&#xff0c;为什么多态的条件是那样的&#xff08;虚函数表&#xff09; 首先&#xff0c;调用虚函数必须是 父类的 指针或 引用&#xf…

KT142C-sop16语音芯片ic的功能介绍 支持pwm和dac输出 usb直接更新内置空间

1.1 简介 KT142C是一个提供串口的SOP16语音芯片&#xff0c;完美的集成了MP3的硬解码。内置330KByte的空间&#xff0c;最大支持330秒的语音长度&#xff0c;支持多段语音&#xff0c;支持直驱0.5W的扬声器无需外置功放 软件支持串口通信协议&#xff0c;默认波特率9600.同时…