Profiling Java Application with Systemtap
https://laurent-leturgez.com/2017/12/22/profiling-java-application-with-systemtap/
I’m not a JVM internals geek but I was sure there was a way to do the job without restarting the JVM, and I found some cool stuff with Systemtap.
To do this, you have to install two packages on your linux distribution: systemtap and systemtap-runtime-java (and configure correctly your user environment):
[root@spark ~]# yum install systemtap systemtap-runtime-java
Please note that I used a CentOS 7.4 distribution.
Then, and for the demo, I wrote a very small piece of Java that do these steps:
- Prints the JVM PID
- Wait for a key to be pressed. During this time, you will have to execute the systemtap script I will described later.
- Execute a loop ten times, each loop with print a message and wait one second, and this last step is executed in a method name “loop_and_wait”.
Here’s the sample code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package com.premiseo; import java.lang.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; class Example { public static void loop_and_wait( int n) throws InterruptedException{ System.out.println( "Waiting " +n+ "ms... Tick" ); Thread.sleep(n); } public static void main(String[] args) { System.out.println( "PID = " +java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split( "@" )[ 0 ]); System.out.println( "Press any key when ready ..." ); try { BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String next = in.readLine(); } catch (IOException ioe) { ioe.printStackTrace(); } try { for ( int i= 0 ;i< 10 ;i++) { loop_and_wait( 1000 ); } } catch (InterruptedException ie) { ie.printStackTrace(); } } } |
Then, compile and execute … very basic I said
[spark@spark java]$ javac -cp $CLASSPATH:. com/premiseo/Example.java
[spark@spark java]$ java -cp $CLASSPATH:. com.premiseo.Example
PID = 9928
Press any key when ready ... Waiting 1000ms... Tick
Waiting 1000ms... Tick
Waiting 1000ms... Tick
Waiting 1000ms... Tick
Waiting 1000ms... Tick
Waiting 1000ms... Tick
Waiting 1000ms... Tick
Waiting 1000ms... Tick
Waiting 1000ms... Tick
Waiting 1000ms... Tick
Now, to answer to Tanel, I used a short systemtap script that will profile the program and specially the loop_and_wait method. I will count the number of times the loop_and_wait method has been called, and I will account the time spent in this method execution.
To do that, I had to write two probes related to:
- the full name of the class, including the package name: com.premiseo.Example
- the class name where the method is defined: Example
- the method name I want to profile: loop_and_wait
The first one will be executed when the program will start to execute the targeted method (java(“com.premiseo.Example”).class(“Example”).method(“loop_and_wait”)), the second one will be executed when the method will return (java(“com.premiseo.Example”).class(“Example”).method(“loop_and_wait”).return)
The related systemtap script is given below:
#!/usr/bin/env stap global counter,timespent,t probe begin {
printf("Press Ctrl+C to stop profiling\n")
counter=0
timespent=0
} probe java("com.premiseo.Example").class("Example").method("loop_and_wait")
{
counter++
t=gettimeofday_ms()
} probe java("com.premiseo.Example").class("Example").method("loop_and_wait").return
{
timespent+=gettimeofday_ms()-t
} probe end {
printf("Number of calls for loop_and_wait method: %ld \n", counter)
printf("Time Spent in method loop_and_wait: %ld msecs \n", timespent)
}
Execution of this systemtap script gave the following result (click the image for full size):
Is it dynamic? Yes, no need to restart the running JVM process you want to target. If you want to target a specific JVM process id, you can use the stap’s “-x” option, add the modify your probe definition like this:
probe java("com.premiseo.Example").class("Example").method("loop_and_wait")
{
if (pid() == target())
counter++
t=gettimeofday_ms()
}
There’s a limitation, you cannot use wilcards in the java probe definition (java(“com.premiseo.Example”).class(“Example”).method(“loop*”) … for example). That would have been useful to profile a set of methods in the same class … but not possible currently.
If you want to read more about this kind of stuff, please read the following websites:
- https://developers.redhat.com/blog/2014/01/10/probing-java-w-systemtap/
- https://sourceware.org/systemtap/langref/Probe_points.html#SECTION00056000000000000000
- https://myaut.github.io/dtrace-stap-book/app/java.html
And … that’s all for today !!
Profiling Java Application with Systemtap的更多相关文章
- velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools
通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用ve ...
- maven: 打包可运行的jar包(java application)及依赖项处理
IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: <plugin> <groupId>org.codehau ...
- How to run a (Tomcat)Java application server on a Azure virtual machine
http://www.windowsazure.com/en-us/documentation/articles/virtual-machines-java-run-tomcat-applicatio ...
- The differences between Java application and Java applet
在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序--Applet程序.Applet程序(也称Java小程序)是运行于各种网页文件中,用于 ...
- Java Applet与Java Application的区别
转自:http://www.educity.cn/java/500609.html 在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序-- ...
- How to deploy JAVA Application on Azure Service Fabric
At this moment, Azure Service Fabric does not support JAVA application natively (but it's on the sup ...
- Java Applet与Java Application的特点
java application是应用程序,用于桌面开发,java applet是小应用程序,一般嵌入到网页里运行.applet一般用于B/S页面上作为插件式的开发,而application主要是桌面 ...
- Debugging java application with netbean
Debugging Java Applications with NetBeans from:https://manikandanmv.wordpress.com/2009/09/24/debu ...
- 非web环境的注解配置的spring项目应用(non-web, Spring-data-jpa, JavaConfig, Java Application, Maven, AnnotationConfigApplicationContext)
非web环境的spring应用 springframework提供的spring容器,非常适合应用于javaweb环境中. 同时,spring组件的低耦合性为普通java应用也提供了足够的支持. 以下 ...
随机推荐
- Python-生产者消费模型 线程
7.生产者消费者模型(*****)(思聪吃热狗代码) 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题. 该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度 为什么要使 ...
- PYTHON-模块 sys os random shutil
import sys # 环境变量# print(sys.path)# # 查看已经加载的模块# print(sys.modules)# # 获取终端调用时的参数# print(sys.argv)# ...
- 【python】xsspider零碎知识点
1.提取url信息 urlparse() from urlparse import urlparse url = "http://scrapy-chs.readthedocs.io/zh_C ...
- cf220b
不知道为什么线段树区间更新专题里有这题.. 可以用莫队解,也可以直接开数组解 /* n个询问,m个元素 O(m*m):记录每个元素出现次数,筛掉出现次数小于数值的数 */ #include<io ...
- 【转】crontab实用手册
前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...
- 浅谈Phoenix在HBase中的应用
一.前言 业务使用HBase已经有一段时间了,期间也反馈了很多问题,其中反馈最多的是HBase是否支持SQL查询和二级索引,由于HBase在这两块上目前暂不支持,导致业务在使用时无法更好的利用现有的经 ...
- RabbitMQ(四): rabbitmq 的消息确认机制(事务+confirm)
在 rabbitmq 中我们可以通过持久化数据解决 rabbitmq 服务器异常的数据丢失问题. 问题:生产者将消息发送出去之后,消息到底有没有到达 rabbitmq 服务器.默认情况下是不知道的. ...
- C#中decimal ,double,float的区别
浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit sin ...
- ELK - MAC环境搭建
ELK - MAC环境搭建 本文旨在记录elasticsearch.logstash.kibana在mac下的安装与启动. 写在前面 ELK的官方文档对与它们的使用方法已经讲的非常清楚了,这里只对相关 ...
- BZOJ1588 [HNOI2002]营业额统计 set
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1588 题意概括 给出数列,求 ∑F[i],其中F[1] = a[1] , F[i] = min( ...