我是靠谱客的博主 无限白昼,最近开发中收集的这篇文章主要介绍java火焰_利用火焰图查找java耗时最长的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

测试用例

public class Test{

public native void testMethod();

}

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

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

//输入输出

#include

//生成的头文件

#include "Test.h"

//sleep的头文件

#include

using namespace std;

JNIEXPORT void JNICALL Java_Test_testMethod

(JNIEnv *, jobject){

cout<

sleep(4000);

}

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

我们尝试方法调用

public class Main{

static{

System.load("/Users/libjnitest.so");

}

public static void main(String[] args) {

Test test= new Test();

while(true){

test.testMethod();

}

}

}

要调用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文件,最后生成火焰图。

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

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

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

小结

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

最后

以上就是无限白昼为你收集整理的java火焰_利用火焰图查找java耗时最长的方法的全部内容,希望文章能够帮你解决java火焰_利用火焰图查找java耗时最长的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(467)

评论列表共有 0 条评论

立即
投稿
返回
顶部