原标题:利用火焰图查找java耗时最长的方法

众所周知java方法有两种,一种是纯粹的java方法,另外一种是jni,java调用c的,方法声明是java的,实现并不是。

现在通过jni实现一些效率的提升已经很常见了。下面通过一个例子,包含jni。我们来通过火焰图分析一下方法热点。

测试用例

上面是一个简单的类,里面只有一个jni的调用。

我们通过javac编译,然后通过javah生成jni的头文件。默认生成的就是类名.h。现在生成的为Test.h。我们把头文件里的方法拿出来进行实现。

cpp文件编写好以后就可以生成动态库了。

编译也是需要分平台的。包括生成的名字,windows平台叫xxx.dll。编译的指令也是需要区分,windows也可以装gcc。建议安装gcc来进行编译,命令改动不大,vs系列的编译指令也变了。

g++ -c JniTest.cpp -I /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/include -I /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/include/darwin

g++ -m64 -fpic -shared -o libjnitest.so JniTest.o

我们尝试方法调用

要调用jni。所以这里必须load一下。这里load的方式有多种,demo里用最简单的一种,加载固定路径的。

生成jfr

jcmd pid JFR.start name=test1 duration=240s settings=profile.jfc filename=output3.jfr

这里参数不做特殊介绍了,这里最好使用openjdk。jfr这个功能是oracle jdk的一个商业特性。所以使用openjdk就没有什么商业的问题,8也有jfr的版本,11自带。需要大家按照自己的需要进行下载。

为什么是火焰图

如果能解析堆栈,我们是不是使用统计的方式就可以。

没错,其实就是统计的方式,例如table这种,但是方法堆栈这种是有上下文联系的,B调用了C。每次采集的堆栈里,都会有B,C。执行完一段时间,B再调用D。堆栈就有B,D的信息了。如果单独统计每个方法,就没有连贯性,就不知道他是从B到C或者B到D,只能看到BCD三者。这个说虽然知道结果,但是不知道是否应该优化。

火焰图正好能展示这样的层级关系。可以看下面的操作。

生成火焰图

这里我自己写了一个工具解析jfr文件,最后生成火焰图。

这里说一下如何看火焰图。

火焰图本身代表的一种比例,并不是实际值。最宽的说明比率最大,也就是我们常说的方法热点。也是优化的最佳考虑。

火焰图也可能出现无法优化的情况,就是最宽的上面均匀分布柱状图。证明方法外层确实是个热点,但是里面的方法执行的东西再改变。至于是否能进行优化,这样一般是个业务问题。

小结

我们在进行方法分析的时候,可以利用火焰图找出方法的热点。然后再进行针对性的优化,利用openjdk11的jfr特性,可以更方法我们进行方法采样。最重要的一点就是可以生成jni的栈。返回搜狐,查看更多

责任编辑:

java 火焰_利用火焰图查找java耗时最长的方法相关推荐

  1. python构造方法与java区别_一张图秒懂Java和Python的区别,你知道吗?

    对于程序员的语言千千万JAVA\C\C++\PHP\Python不同的程序员使用着不同的语言,做着功能相似需求却不同的产品. 但是最近Python在人工智能的推动下突然出现在人们的面前,其实和Java ...

  2. UML设计java程序_利用UML序列图设计Java应用程序详解

    [IT168 技术文章] Java应用程序由许多类所构成,是Java实现面向对象应用程序的核心.类图主要描述Java应用程序中各种类之间的相互静态关系,如类的继承.抽象.接口以及各种关联.要利用UML ...

  3. winsock使用java编写_利用Socket进行Java网络编程(一)

    利用Socket进行Java网络编程(一) 考试吧(Exam8.com) 2003-03-04 08:00:00 评论(0)条 作者: 郗旻 Socket是网络上运行的两个程序间双向通讯的一端,它既可 ...

  4. 如何java面试_短时间如何过java面试?

    这题我会!作为一个编程界老司机,我曾总结过一套Java常见的面试考点大全,不知道帮助过多少程序员拿下offer. 现在我把这套Java面试大全放出来,希望对大家有所帮助! 本文内容过长,建议大家先赞后 ...

  5. 双表查询java代码_什么是JDBC?Java数据库连接性简介

    JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...

  6. 栈和队列的Java实现_栈和队列的java简单实现

    栈:这是一个先进后出的数据结构,生活中类似的浏览器的返回上一页就可以利用此结构实现,代码如下: public class Stack{private Object[] data;//存储数据 priv ...

  7. java 中间件_从头到尾说一遍Java(中间件)垃圾回收

    之前上学的时候有这个一个梗,说在食堂里吃饭,吃完把餐盘端走清理的,是 C++ 程序员,吃完直接就走的,是 Java 程序员. 确实,在 Java 的世界里,似乎我们不用对垃圾回收那么的专注,很多初学者 ...

  8. 有控制雷电武器的java游戏_雷电飞机射击游戏 JAVA

    一.程序概述 1.开发环境 开发程序的工具Eclipse是著名的跨平台的自由集成开发环境.一个开放源代码的.基于Java的课扩展开发平台.就其本身而言,它只是一个框架和一组服务,用与通过插件组件构建开 ...

  9. 拓扑排序之java实现_有向图和拓扑排序Java实现

    package practice; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Stack; pu ...

最新文章

  1. 网站长尾词布置需要注意什么事项?
  2. 通过libVirt抓取kvm虚拟机监控指标数据
  3. Matlab中常用希腊字母表查询
  4. OAM Kubernetes 标准实现与核心依赖库发布 | 云原生生态周报 Vol. 52
  5. Python istitle() 方法
  6. 各种好用的代码生成器
  7. java list断点续传_java实现文件断点续传下载功能
  8. (微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆)http://blog.csdn.net/liaohaojian/article/details/70175835
  9. python核心理念_《Python核心技术第二版》笔记
  10. java静态初始化块无法直接调用,关于JAVA静态初始化块,初始化块,构造器调用顺序的有关问题...
  11. 优化SQL的执行速度
  12. webstorm简单介绍,webstrom基本使用
  13. bootstrap 可编辑列表,实现某个单元格动态控制是否可编辑状态
  14. 智课雅思词汇---二十四、名词性后缀ary(也是形容词后缀)
  15. 28岁华为员工工资表曝光牛逼的人注定会牛逼你们难道自甘堕落?
  16. HarmonyOS 系统架构
  17. [转载] 晓说——第13期:欧洲杯硝烟再起 “阴谋论”说赌球黑幕
  18. Doris源码解析[一、负载均衡]
  19. 北京计划以环球影城为核心,开发文化旅游精品线路
  20. 2022金九银十最全的软件测试面试题,能不能找到合适工作就看它了

热门文章

  1. 最通俗易懂的讲解:lambda表达式
  2. 李巧奴拜张顺为叔叔 水浒
  3. STM32F103入门 | 3.MDK5.27 安装教程
  4. DDR3 DDR4信号组 和原理图设计指南
  5. 图论基础 —— 概述
  6. 快排是什么_揭秘快速排名原理
  7. TCP 连接管理机制(二)——TCP四次挥手的TIME_WAIT、CLOSE_WAIT状态
  8. 【TWVRP】基于matlab蚁群算法求解带时间窗车辆路径规划问题【含Matlab源码 1930期】
  9. Stable Diffusion人工智能图像合成
  10. 《像外行一样思考,像专家一样实践》---产生创新的过程