一、背景

(1)、随着微服务架构的逐渐推广,一个大型的单个应用程序被拆分为数个微服务系统,这为研发人员的本地调试跟踪带来困难
(2)、在微服务架构中,由于业务的复杂性,常常一个业务流程涉及好数个微服务系统的调用,性能排查时到底因为哪个微服务系统的性能瓶颈从而导致整个业务性能的瓶颈,不好定位
        因此,下面为大家介绍目前有哪些开源工具支持查看应用JVM状况、Debug调试跟踪、调用链跟踪等功能,方便应用问题快速定位和性能优化

1.1、什么样的场景需要性能调优

(1)、OutOfMemoryError,内存不足
(2)、内存泄露
(3)、线程死锁
(4)、锁争用(Lock Contention)
(5)、Java进程消耗CPU过高
       这些问题出现的时候常常通过重启服务器或者调大内存来临时解决,实际情况,还需要尽量还原当时的业务场景,并分析内存、线程等数据,通过分析找到最终的解决方案。

二、常见调优工具

2.1、jvisualvm应用监控

第一步:应用JVM参数添加JMX监控参数

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<应用所在机器IP> -Dcom.sun.management.jmxremote.port=<“2”+应用端口> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

第二步:打开jvisualvm监控工具

如果本地有安装jdk环境,打开终端工具,输入:jvisualvm 命令回车进入窗口界面,然后在在《远程》菜单上右击后点击《添加远程主机》,然后设置端口点击《确定》即可

JMX端口:“2”+“应用端口号”

例如:应用端口号为:8011,那它的JMX端口为:28011

2.2、应用Debug模式开启

第一步:应用JVM参数新增Debug调试参数

JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=<“1”+应用端口号>,server=y,suspend=n"

第二步:Intellij idea开发环境应用Debug调试

打开Intellij idea 的Run Configurations,点击添加Remote,然后配置应用名称、应用地址、端口号,点击《确定》,最后运行调试
应用Debug端口生成规则:“1”+“应用端口号”
例如:应用端口号为:8011,那它的Debug调试端口为:18011
注意:
(1)、调试时本地分支代码和部署的分支代码保持一致
(2)、调试时设置的断点会影响其他人的正常使用

2.3、APM-PinPoint性能调用链跟踪

Pinpoint是一款全链路分析工具,提供了无侵入式的调用链监控、方法执行详情查看、应用状态信息监控等功能。基于GoogleDapper论文进行的实现,与另一款开源的全链路分析工具Zipkin类似,但相比Zipkin提供了无侵入式、代码维度的监控等更多的特性,Pinpoint支持的功能比较丰富。

参考网站:
(1)、Pinpoint安装部署
(2)、回到网易后开源APM技术选型与实战
(3)、2个实例+5个维度解读APM技术

(1)、服务拓扑图

对整个系统中应用的调用关系进行了可视化的展示,单击某个服务节点,可以显示该节点的详细信息,比如当前节点状态、请求数量等

(2)、请求调用栈查看

对分布式环境中每个请求提供了代码维度的可见性,可以在页面中查看请求针对到代码维度的执行详情,帮助查找请求的瓶颈和故障原因。

三、性能调优工具实践

3.1、Web跨境Redis请求过于频繁,导致系统响应过慢

(1)、菜单Pattern匹配存储在rendis,缓存交互过多;解决方案:稳定不变的值,例如StringMatchUtils中的正则模型解释Pattern本地缓存替换redis缓存

总结:通过Pattern本地缓存替换redis缓存优化,减少了130多次的redis访问

(2)、Shiro频繁访问Redis读取和更新session;解决方案:ShareCacheSessionDao使用LocalThread缓存同一请求线程中的session,解决Shiro频繁访问Redis读取和更新session

总结:通过对Shiro访问Redis优化,Redis访问次数减少了1200多次

(3)、本地缓存穿透;当key对应的value为空时,缓存失效;解决方案:对统一配置key值为空也进行缓存,5分钟的有效期;防止统一配置缓存穿透问题

Java应用性能调优工具介绍及实践相关推荐

  1. java 性能 火焰图_性能调优工具-火焰图

    性能调优工具-火焰图 发布时间:2019-07-17 19:29, 浏览次数:402 前言 工具的进化一直是人类生产力进步的标志,合理使用工具能大大提高我们的工作效率,遇到问题时,合理使用工具更能加快 ...

  2. jvm性能调优工具之 jmap使用详解

    本文来说下jvm性能调优工具之 jmap使用详解 文章目录 概述 jmap用法 示例一:no option 示例二:heap 示例三:histo[:live] 示例四:clstats 示例五:fina ...

  3. Android系统性能调优工具介绍

    经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优工具介绍 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是: 测评 ...

  4. JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)...

    2019独角兽企业重金招聘Python工程师标准>>> 前提概要:         JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外 ...

  5. JVM性能调优(4)——性能调优工具

    目录 一.JDK工具1.JDK工具2.利用 jps 找出进程3.利用 jstat 查看VM统计信息4.利用 jmap 查看对象分布情况5.利用 jstack 分析线程栈 二.Linux 命令行工具1. ...

  6. 【JVM 学习笔记 05】:JVM性能调优工具的使用和优化案例

    [JVM 学习笔记 05]:JVM性能调优工具的使用 1. 使用 jstat(命令行工具) 查看线上系统的JVM运行状况 1.1 常用命令 1.2 使用技巧 1.2.1 随着系统运行,每秒钟会在年轻代 ...

  7. HTML5应用性能调优工具WAPA – 使用篇

    转载: http://software.intel.com/zh-cn/blogs/2014/02/28/html5-wapa/?utm_campaign=CSDN&utm_source=in ...

  8. Java 编程性能调优

    把 Java 性能调优分成 5 个层级:Java 编程.多线程.JVM 性能检测.设计模式.数据库性能,每个层级下都覆盖了最常见的优化问题.下面分别给你梳理一下: 可参考地址:Java性能调优全攻略来 ...

  9. Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

    文章目录 一.本次学习重点内容: 本堂课的知识要点有哪些? 1.性能发现工具pprof 2.性能调优案例 二.详细知识点介绍: 1.性能调优简介 性能调优原则: 2.性能发现工具pprof 说明: p ...

最新文章

  1. python实现字典遍历稳定有序使用collection包OrderedDict
  2. Android内核开发必备知识
  3. java设计模式---观察者模式
  4. lambda expressions are not supported at this language level
  5. wxWidgets:wxStatusBar类用法
  6. 人行二代征信报告模版_人行首度明确,替代数据纳入征信管理!美化信用报告,难了...
  7. 创建ListView的基本步骤
  8. 如何在源代码(而非库文件)模式下构建并且运行 SAP Spartacus
  9. 电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...
  10. 【LeetCode笔记】162. 寻找峰值(Java、二分、偏数学)
  11. 20 个 GPU 可承载相当于全球互联网流量、Grace CPU 超级芯片现世,英伟达这届 GTC 发布了什么?...
  12. linux 文件句柄 sock,linux socket句柄
  13. 排序不等式、证明及其应用
  14. sspanel 常用审计规则
  15. 学习Camera2自定义相机从入门到高级一篇就够了
  16. Android 网络质量 + 下载测速 (facebook/network-connection-class 使用)
  17. Thrift oneway关键字
  18. ios 区分iphone ipod ipad的方法及获取设备名称。
  19. Python||PyCharm||代码为什么是灰色的???(已解决)
  20. JMM可见性内存模型

热门文章

  1. 安装“消息队列 (MSMQ)”
  2. 如何让new操作符只构造,不申请内存
  3. memmove()/mmecpy()
  4. std::string的resize()与reserve()的区别
  5. 学习C++/C的宏与for循环的结合
  6. 1024看到这篇文章的程序员,能不能把你的电脑桌面右下角截图回复
  7. docker 定时重启脚本_使用 Go 添加启动脚本
  8. cesium 页面截图_Cesium开发入门篇 | 02开发环境搭建及第一个示例
  9. python连连看小游戏_python实现连连看游戏
  10. python合并word表格单元格_python docx模块读取word表格遇到合并单元格时的处理