这次是学习使用一个java sample工具,顺便了解一些linux、jvm的知识
浏览github的时候,发现了一个不错的java工具——async-profile,这和平时使用的JMC差不多,不过它是开源的,对于我们不算是黑盒。时间充裕的话,还可以看看它的源码,因为它使用了Hotspot的一些回调,顺道还能加深对Hotspot的了解。本文会从4个方面总结一下心得体会。
async profile的使用
工具的使用还是很简单的,官方也有很详细的说明(源码下载后记得make
编译一下)
1 | $ jps |
当你./profiler.sh stop 8983
的时候,会将之前sample的数据打印在控制台,不过通常数据都很多,我会选择-f /tmp/sample.txt
用文件保存起来,方便使用
除此之外,-e event
也比较有用,不过使用之前需要list pid
来看看你的机器上支持哪些events,比如我的机器上返回的是
1 | Perf events: |
可以看到在我的mac上,支持的类型比较少,主要是perf_events是linux上的工具。
我在centos7上看到这样的结果
1 | Perf events: |
-t pid
也很常用,它是根据线程来sample的,这样对我们后续的分析会带来好处
限制条件
async profile特点
一句话概括,就是很小的额外开销,非常适合于生产环境。cpu profiling使用的是perf_events和java code address的match来追踪;memory allocation使用的是Hotspot上的回调,不需要字节码修改等复杂的技术。
jvm safePoint bias
这里要说的是safePoint和jvm profile的关系
我看到有一位高手写了2篇文章,算是通俗易懂地解释了其他profile的问题所在
why-most-sampling-java-profilers-are
perf工具
这是linux内核自带的性能分析工具。从前面2段$ ./profiler.sh list pid
结果也能看到,有了perf工具之后,可以追踪到硬件或者内核级别的软件事件。
在centos上的安装方式sudo yum install perf
举个例子,perf stat
命令可以得到一个全局的统计信息,能在第一时间帮助我们分析问题
1 | $ perf stat echo $JAVA_HOME |
其他的命令包括:perf top
用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程……等等
详细去找手册就好