Java性能优化常用命令及工具简介

2023-11-08

简述

开发中可能都会碰到程序运行越来越慢,占用内存和cpu越来越高,那如何定位问题呢?
我们将问题简单分类为三个常见的场景
1,多线程或边界情况等引起的异常
2,内存异常
3,CPU异常
首先这三个问题肯定是会相互影响的,我们只是为了方便表述,将问题进行了非常简单的分类而已。
(文中出现的pid都是需要替换为具体进程号)

1.多线程或边界情况等引起的异常

很多时候后面两种问题的原因都是第一种情况影响的,尤其是没有做个详尽的压力测试的情况。所以第一种情况我们最好防患于未然,白盒测试,压力测试搞起来。
可以用Jmeter来进行压力测试,在项目中第一个基础模块出来以后就将JMeter工程准备好。每过一段时间或每次重大版本更新都将Jmeter工程维护起来,然后进行压力测试。绝对能够发现非常多的问题,也会避免非常多的上线以后的雷。

2.内存异常

内存异常主要表现为内存持续升高或者反映在CPU上的GC过于频繁或持stop the world time时间太长。这时候我们需要查看进程中的对象个数和GC频率与耗时。
jmap命令可以方便的查看内存中对象的个数和大小。

jmap -histo pid | more

生成内容如下图所示,可见String对象现在有812003个。
在这里插入图片描述

但是这些对象不见得是所有存活的对象,有些生命周期已经结束,但是还未到GC的时候,所以并未被回收。可以通过

jmap -histo:live pid | more

来强制执行一次GC再统计内存中的对象数。结果如下图所示,
在这里插入图片描述

如果GC完以后还有明显的超标对象,那基本就可以确定是哪个对象的生命周期没有控制好了。

或者也可能是另外一种情况,就是查看内存中的对象的时候有些对象的数量变化特别剧烈,可能仅仅间隔10秒的两次jmap -histo pid命令就可以看到以百千万记的对象数量变动,这种变化也会反映在GC频率上。

jstat -gc pid 5000

如下图,从倒数第五列YGC可知,约每15秒执行了一次young gc
在这里插入图片描述

综上,不被回收的和剧烈变化的对象都是我们要重点追查的对象。那问题来了,代码中可能有几十处在用这个对象,究竟是那儿没有控制好呢?
这时候我们可以用Jprofiler来分析堆内存文件或attach到该进程来查看。例如我们可以先用

jmap -dump:format=b,file=20200124.jmap.hprof pid

下载堆内存文件然后进行分析。Jprofiler的具体用法就不赘述了。可以用incoming references来找到具体类对该对象的引用所占百分比。非常贴心了~
来自网络截图,侵必删
来自网络截图,侵必删

3. CPU问题

CPU问题常见有死锁、某方法耗时过长
首先我们可以用

top -Hp pid

来找到占用cpu高的线程。
在这里插入图片描述

如我们要查看13089的线程为什么占用了90%(原谅我假装将2.3%看成了90%)。首先我们需要将线程ID转为16进制,因为用jstack命令查看的线程ID都是16进制的。可以用直接在shell中输入printf “%x\n” 13089进行转化如图
在这里插入图片描述

然后用

jstack -l 13055 | grep -A10 -B4 3321

来查看这个线程在干嘛,通常一次看到的内容可能并不太准确,需要多执行几次。如果多次观察发现该状态经常为Blocked或者虽然是Runnable但是进程停留在一个方法。说有锁设计不合理,或者Runnable停留的那个方法耗时很长。

总结

jmeter

jmap 
	jmap -histo pid |more
	jmap -histo:live pid | more
	jmap -dump:format=b,file=2020.jmap.hprof pid

Jprofiler

jstat
	jstat -gc pid 5000

top -Hp pid
printf "%x\n" threadId
jstack -l pid | grep -A12 ’tId\|running’

以上就是常用的性能优化或者问题排查时候需要用的基本命令或工具。希望对您也有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java性能优化常用命令及工具简介 的相关文章

随机推荐

  • 密码学哈希函数

    哈希函数H使用变长数据分组M作为输入 生成定长结果h H M 这一结果也称哈希值 哈希码或散列值 好的哈希函数的特点如下 对大输入集合使用该函数时 输出是均匀分布的且是明显随机的 概括的说 哈希函数的主要目标是保证数据的完整性 在安全应用中
  • Visual Studio 2019 Community 版离线注册

    本文主要参考 https blog csdn net songfuliang2011 article details 102486451 Visual Studio 2019 Community 虽然是免费使用 但必须在线注册一个账号 否则
  • Spring Boot 事务详解

    自己学习事务做的笔记 方便记忆和复习 1 事务是为了解决数据安全问题而存在的 最经典的例子就是银行转账问题 A账户给B账户转账100元 A账户扣除100元后由于不可抗力因素导致程序中断 B账户没有收到那100元 A账户那100元凭空消失 肯
  • Ubuntu IDEA安装和配置以及eclipse下载

    Idea2022版本官网下载 https www jetbrains com idea download section linux sudo tar zxvf ideaIU 2022 3 3 tar gz C usr local sudo
  • 闲鱼玩法平台系列文章——双11实操篇

    背景 营销玩法是电商行业进行商品促销和用户增长的重要手段 上一篇中介绍了闲鱼的玩法平台 多啦A梦 本篇将介绍在该系统上承接的玩法 闲鱼作为闲置循环工厂也参与了大促 为了让更多闲置在闲鱼游起来 在商品侧设计了 转卖抽奖 活动玩法 为了能让更多
  • asoc 如何定义各种widget、route

    上一节中 介绍了DAPM框架中几个重要的数据结构 snd soc dapm widget snd soc dapm path snd soc dapm route 其中snd soc dapm path无需我们自己定义 它会在注册snd s
  • 大数据治理——《华为数据之道》

    重点章节 1 差异化的数据分类管理 第二章 信息架构 第三章 数据底座 第三章 次重点 2 数据服务 第四章 数据质量 第五章 数据安全与隐私 第六章 其他 3 数据感知 第五章 数据综合治理体系 第二章 企业数字化转型 第三章 重要概念和
  • 【自用】西门子s7-200连接显示屏和物联网盒子完整配置过程

    总览 1 PLC配置 2 显示屏配置 3 物联网盒子配置 一 PLC配置 1 连接PLC软件 STEP 7MicroWIN V4 0 SP9完整版 链接 https pan baidu com s 17LMEXnbkQZMPI8Bte24E
  • 使用单片机控制600W升压模块输出电压

    要想用单片机控制升降压模块的输出电压 首先想到的就是使用电信号控制FB电阻大小 原理上数字电位器可以满足这个需求 那么问题就在于 如何评估数字电位器大小 如何知道FB电阻和输出电压的关系 如果是集成DCDC变换器模块比较简单 一块板上没几个
  • QT 消息对话框按钮显示

    前言 搞QT嘛 大多数都是军工 都要国产化 而且消息对话框的按钮的英文也不是很得劲 所以需要汉化 使用静态函数的按钮就是显示英文 汉化的代码如下 void Widget on pushButton clicked QMessageBox b
  • python selenium 获取frame中的元素

    版权声明 本文为徐代龙原创文章 未经徐代龙允许不得转载 https blog csdn net xudailong blog 使用情景 在很多的视频播放网站 视频播放页面往往获取不到iframe里面的内容 也或者是模拟登陆的时候 会跳入一个
  • 标量、向量、矩阵之间求导笔记

    2019 12 06 今天 碰到了下面有关向量对于向量的导数 不太明白为什么最后得到的是A的转置 d A x
  • 区块链Fabric 排序、二次开发

    1 排序 Orderer 排序 Orderer 指对区块链网络中不同通道产生的交易进行排序 并广播给节点 Peer 排序 Orderer 是以可插拔组件的方式实现 目前分为SOLO和Kafka两种类型 SOLO 仅有一个Orderer服务节
  • React 状态管理器,我是这样选的

    前言 我们的前端团队在一直深度使用 React 从最早的 CRA 到后来切换到 umijs 从 1 x 2 x 3 x 再到现在的 4 x 其中有一点不变的 就是我们一直在使用基于 react redux 思想的 dva 作为状态管理工具
  • React hooks 不能拿到最新的的setState的值

    在class中 如果 我们想要拿到setState 最新的值 去调用api 直接通过this setState的回调函数就可以了 this setState latestValue 我是最新的 gt this callApi latestV
  • Koa项目搭建----从零搭建Koa项目

    最近发现使用 Koa 创建项目的博客比较多 但是不够细致 为方便自己和他人 遂整理本博客 本博客会介绍以下内容 1 安装Koa脚手架 即 koa generator 2 创建 Koa 1 项目 3 创建 Koa 2 项目 4 坑 5 项目运
  • 基于TypeScript的PixiJS开发环境设置(webpack篇)

    转自 http www limbonova com 2017 09 setup pixijs with typescript using webpack 前几天写了一篇用Browserify打包的 PixiJS 的开发环境配置流程 但是We
  • 一个项目所需要的各个模块以及它们对应的功能

    首先你要知道 一个项目它的目的是什么 一个项目最终要达到一个什么效果 其实说白了 一个项目实现的最终结果就是实现对数据库的增删查改 然后返回最终的视图或者数据给前端 这就是一个项目的目的 这也是最简单的说法 那要实现这个从数据库当中的增删查
  • CSP201312-1 出现次数最多的数

    include
  • Java性能优化常用命令及工具简介

    Java性能优化常用命令及工具简介 简述 1 多线程或边界情况等引起的异常 2 内存异常 3 CPU问题 总结 简述 开发中可能都会碰到程序运行越来越慢 占用内存和cpu越来越高 那如何定位问题呢 我们将问题简单分类为三个常见的场景 1 多