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

首发博客地址


背景

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

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

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

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

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

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

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

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

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

如何使用

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

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

然后我们正常启动项目

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

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

实时查看CPU和堆内存

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

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

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

分析结果

火焰图

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

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

要生成火焰图,通常需要使用性能分析工具来采集程序的执行数据。常用的性能分析工具包括Linux下的perf、Java应用程序中的Java

Flight Recorder(JFR)和Java VisualVM等。这些工具可以记录程序的函数调用信息和耗时情况,并生成火焰图。

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

调用树

调用树(Call Tree)是一种可视化工具,用于展示程序在执行过程中函数之间的调用关系。它以树状结构的形式展示了函数的调用层次和调用次数。

在调用树中,根节点表示程序的入口函数,每个子节点表示一个被调用的函数。通过观察调用树,我们可以了解函数之间的调用流程,找到函数的调用路径和调用次数,从而帮助我们分析程序的执行逻辑和性能瓶颈。

调用树通常会显示每个函数的调用次数和总耗时。这样我们可以快速识别出调用次数较多或耗时较长的函数,从而找到可能的性能问题和优化的方向。

方法列表

时间线

事件

分析

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

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

    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多平台发布

使用Java分析器优化代码性能,解决OOM问题的更多相关文章

  1. java开发之提高java和mysql代码性能和质量

    0.if嵌套的层数最好不要超过3层 点击(此处)折叠或打开 import java.util.HashMap; import java.util.Map; public class Qiantao { ...

  2. Java内存优化和性能优化的几点建议

    1.没有必要时请不用使用静态变量 使用Java的开发者都知道,当某个对象被定义为stataic变量所引用,这个对象所占有的内存将不会被回收.有时,开发者会将经常调用的对象或者变量定义为static,以 ...

  3. Java之同步代码块处理继承Thread类的线程安全问题

    package com.atguigu.java; /** *//** * 使用同步代码块解决继承Thread类的方式的线程安全问题 * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thre ...

  4. Java 性能优化手册 — 提高 Java 代码性能的各种技巧

    转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...

  5. Java代码性能优化的 39个细节

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1:在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提 ...

  6. 针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...

  7. Android异常与性能优化相关面试问题-OOM异常面试问题详解

    什么是OOM? 当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out Of Memory异常. 一些容易混淆的概念: 内存溢出:指的就是OOM. 内存抖动:是短时间 ...

  8. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  9. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  10. Android 性能优化:使用 Lint 优化代码、去除多余资源

    前言 在保证代码没有功能问题,完成业务开发之余,有追求的程序员还要追求代码的规范.可维护性. 今天,以“成为优秀的程序员”为目标的拭心将和大家一起精益求精,学习使用 Lint 优化我们的代码. 什么是 ...

随机推荐

  1. 非工程师指南: 训练 LLaMA 2 聊天机器人

    引言 本教程将向你展示在不编写一行代码的情况下,如何构建自己的开源 ChatGPT,这样人人都能构建自己的聊天模型.我们将以 LLaMA 2 基础模型为例,在开源指令数据集上针对聊天场景对其进行微调, ...

  2. JavaFx设置图标(二)

    JavaFx设置图标(二) JavaFX 从入门入门到入土系列 JavaFx设置图标,需要注意,我这里是Maven管理项目 需要将图片放到resources/img/avatar.jpg下 impor ...

  3. ubuntu 之 lftp 上传 和下载

    1. 安装 sudo apt-get install lftp 2. 简单教程 2.0 声明:上传或下载文件 用get 或 mget,这种方式 不包含文件夹本身,如果需要连文件夹一起上传或下载则需要使 ...

  4. 快速上手Linux核心命令(二):关机、重启

    @ 目录 前言 一.在命令行下查看命令帮助 man 命令 --help 命令 info命令 二.Linux关机.重启 shutdown reboot.halt.poweroff 前言 从这篇开始,我们 ...

  5. 华为云如何赋能无人车飞驰?从这群AI热血少年谈起

    摘要:由华为云携手上海交通大学学生创新中心举办的"第二届华为云人工智能大赛 · 无人车挑战杯"中,来自电子科技大学的"暑期休闲队"获得大赛季军. 由华为云携手上 ...

  6. 手把手带你入门加密算法的Python实现

    摘要:一个简单的md5加密算法,带你解开所谓"加密"过程的神秘面纱. 一个简单的md5加密算法,非常适合新手练习 链接:> aHR0cDovL3d3dy5jaHVjaHVqa ...

  7. Vue组件间的传值五大场景,你造吗?

    摘要:组件是 vue.js最强大的功能之一,这五个组件间传值场景你了解吗? 本文分享自华为云社区<你了解Vue组件间传值五大场景吗?>,作者:北极光之夜. . 父组件向子组件传值: 比如有 ...

  8. Koa、koa-router、koa-jwt 鉴权详解:分模块鉴权实践总结

    首先看koa-router koa-router use 熟悉Koa的同学都知道use是用来注册中间件的方法,相比较Koa中的全局中间件,koa-router的中间件则是路由级别的. koa-rout ...

  9. PPT 文字穿插

    软件文字,添加一个形状 先选形状,再选文字 选择拆分 设置对象格式

  10. SpringBoot 记录 access.log 日志

    如何将不同业务模块产生的日志 分多文件记录 Tomcat 中有个日志 loca_access.log 可以记录每个接口的请求耗时,用于做性能等分析比较有用,SpringBoot里,默认不记录这个日志, ...