btrace命令行使用
位于bin目录下面主要有6个脚本,3个windows的,另外3个是Linux的,分别是btrace、btracec、btracer。具体功能如下:
1、btrace
功能: 用于运行BTrace跟踪程序。
命令格式:
btrace [-I <include-path>] [-p <port>] [-cp <classpath>] <pid> <btrace-script> [<args>]
示例:
btrace -cp build/ 1200 AllCalls1.Java
参数含义:
include-path指定头文件的路径,用于脚本预处理功能,可选;
port指定BTrace agent的服务端监听端口号,用来监听clients,默认为2020,可选;
classpath用来指定类加载路径,默认为当前路径,可选;
pid表示进程号,可通过jps命令获取;
btrace-script即为BTrace脚本;btrace脚本如果以.java结尾,会先编译再提交执行。可使用btracec命令对脚本进行预编译。
args是BTrace脚本可选参数,在脚本中可通过"$"和"$length"获取参数信息。
2. btracec
功能: 用于预编译BTrace脚本,用于在编译时期验证脚本正确性。
btracec [-I <include-path>] [-cp <classpath>] [-d <directory>] <one-or-more-BTrace-.java-files>
参数意义同btrace命令一致,directory表示编译结果输出目录。
3. btracer
功能: btracer命令同时启动应用程序和BTrace脚本,即在应用程序启动过程中使用BTrace脚本。而btrace命令针对已运行程序执行BTrace脚本。
命令格式:
btracer <pre-compiled-btrace.class> <application-main-class> <application-args>
参数说明:
pre-compiled-btrace.class表示经过btracec编译后的BTrace脚本。
application-main-class表示应用程序代码;
application-args表示应用程序参数。
该命令的等价写法为:
java -javaagent:btrace-agent.jar=script=<pre-compiled-btrace-script1>[,<pre-compiled-btrace-script1>]* <MainClass> <AppArguments>
btrace脚本限制
In particular, a BTrace class
can not create new objects.
can not create new arrays.
can not throw exceptions.
can not catch exceptions.
can not make arbitrary instance or static method calls - only the public static methods of com.sun.btrace.BTraceUtils class may be called from a BTrace program.
can not assign to static or instance fields of target program's classes and objects. But, BTrace class can assign to it's own static fields ("trace state" can be mutated).
can not have instance fields and methods. Only static public void returning methods are allowed for a BTrace class. And all fields have to be static.
can not have outer, inner, nested or local classes.
can not have synchronized blocks or synchronized methods.
can not have loops (for, while, do..while)
can not extend arbitrary class (super class has to be java.lang.Object)
can not implement interfaces.
can not contains assert statements.
can not use class literals.
jvisualvm 插件
BTrace提供了jvisualvm插件,强烈推荐在jvisualvm中编写和测试BTrace脚本,启动、关闭、发送事件、增加classpath都非常方便。
btrace实例
[java] view plain copy print?
package baby.btrace;
public class CaseObject{
private static int sleepTotalTime=0;
private int sleepTotalTime2=0;
public boolean execute(int sleepTime) throws Exception{
System.out.println("sleep: "+sleepTime);
sleepTotalTime+=sleepTime;
sleepTotalTime2=sleepTotalTime+1;
sleep(sleepTime);
if(sleepTime%2==0)
return true;
else
return false;
}
public void sleep(int sleepTime) throws Exception {
Thread.sleep(sleepTime);
}
}
[java] view plain copy print?
package baby.btrace;
import java.util.Random;
public class CaseObjectMain {
int times = 10;
public static void main(String[] args) {
CaseObjectMain main= new CaseObjectMain();
try {
main.begin();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void begin() throws Exception{
CaseObject object=new CaseObject();
while(true){
times++;
boolean result=doWork(object);
Thread.sleep(1000);
}
}
public boolean doWork(CaseObject object) throws Exception{
Random random=new Random();
boolean temp= object.execute(random.nextInt(1000));
return temp;
}
}
1、获取返回值,参数等信息
[plain] view plain copy print?
/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript {
/* put your code here */
/*指明要查看的方法,类*/
@OnMethod(
clazz="baby.btrace.CaseObject",
method="execute",
location=@Location(Kind.RETURN)
)
/*主要两个参数是对象自己的引用 和 返回值,其它参数都是方法调用时传入的参数*/
public static void traceExecute(@Self baby.btrace.CaseObject object,int sleepTime, @Return boolean result){
println("调用堆栈!!");
println(strcat("返回结果是:",str(result)));
jstack();
println(strcat("时间是:",str(sleepTime)));
}
}
2、获取对象属性值
[plain] view plain copy print?
/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript {
/* put your code here */
/*指明要查看的方法,类*/
@OnMethod(
clazz="baby.btrace.CaseObject",
method="execute",
location=@Location(Kind.RETURN)
)
/*主要两个参数是对象自己的引用 和 返回值,其它参数都是方法调用时传入的参数*/
public static void traceExecute(@Self baby.btrace.CaseObject object,int sleepTime, @Return boolean result){
println("调用堆栈!!");
println(strcat("返回结果是:",str(result)));
jstack();
println(strcat("时间是:",str(sleepTime)));
}
}
3、获取方法执行时长
[plain] view plain copy print?
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript3 {
@TLS private static long startTime = 0;
@OnMethod(
clazz="baby.btrace.CaseObject",
method="execute"
)
public static void startExecute(){
startTime = timeNanos();
}
@OnMethod(
clazz="baby.btrace.CaseObject",
method="execute",
location=@Location(Kind.RETURN)
)
public static void endExecute(@Duration long duration){
long time = timeNanos() - startTime;
println(strcat("execute time(nanos): ", str(time)));
println(strcat("duration(nanos): ", str(duration)));
}
}
4、正则匹配和获取方法执行次数
[plain] view plain copy print?
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript4 {
private static long count;
@OnMethod(
clazz="/.*/",
method="execute",
location=@Location(value=Kind.CALL, clazz="/.*/", method="sleep")
)
public static void traceExecute(@ProbeClassName String pcm, @ProbeMethodName String pmn,
@TargetInstance Object instance, @TargetMethodOrField String method){
println("====== ");
println(strcat("ProbeClassName: ",pcm));
println(strcat("ProbeMethodName: ",pmn));
println(strcat("TargetInstance: ",str(classOf(instance))));
println(strcat("TargetMethodOrField : ",str(method)));
count++;
}
@OnEvent
public static void getCount(){
println(strcat("count: ", str(count)));
}
}
5、正则和事件交互
[plain] view plain copy print?
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript5 {
private static long count;
@OnMethod(
clazz="/.*/",
method="execute",
location=@Location(value=Kind.CALL, clazz="/.*/", method="sleep")
)
public static void traceExecute(@ProbeClassName String pcm, @ProbeMethodName String pmn,
@TargetInstance Object instance, @TargetMethodOrField String method){
println("====== ");
println(strcat("ProbeClassName: ",pcm));
println(strcat("ProbeMethodName: ",pmn));
println(strcat("TargetInstance: ",str(classOf(instance))));
println(strcat("TargetMethodOrField : ",str(method)));
count++;
}
@OnEvent
public static void getCount(){
println(strcat("count: ", str(count)));
}
@OnEvent("A")
public static void getCountA(){
println("==AAAA==== ");
println(strcat("count: ", str(count)));
}
@OnEvent("B")
public static void getCountB(){
println("==BBB==== ");
println(strcat("count: ", str(count)));
}
}
相关推荐
总之,VisualVM v2.1.7是一个强大的性能分析工具,适用于各种Java开发场景,无论是日常开发、调试还是教学研究,都能发挥重要作用。通过深入理解和熟练运用,开发者可以更好地优化Java应用,提高软件质量。
总的来说,VisualVM是Java开发者必备的工具之一,它可以帮助优化代码、调试问题、理解应用程序的运行机制,从而提高软件的性能和稳定性。通过熟练掌握VisualVM的使用,开发者能够更有效地管理和维护Java应用程序。
VisualVM提供了内存分析工具,可以跟踪对象的生命周期,帮助开发者发现并定位可能导致内存泄漏的代码片段。 3. **垃圾回收器监控**: Java的垃圾回收机制对应用性能有直接影响。VisualVM允许用户观察不同垃圾回收...
3. **线程分析**:显示线程状态和堆栈跟踪,有助于调试死锁和其他并发问题。 4. **采样剖析**:通过采样CPU使用情况,找出消耗资源最多的代码片段。 5. **JMX支持**:通过JMX(Java Management Extensions)接口,...
VisualVM是一款由Oracle提供的免费、开源的可视化工具,用于监控和调试Java应用程序。该工具能够帮助开发者深入理解Java虚拟机(JVM)上的应用程序行为,提供了丰富的功能集合,如性能监控、内存分析、线程诊断等。...
VisualVM是一款强大的Java性能分析工具,由Oracle公司开发并维护,它提供了丰富的功能,包括内存分析、线程检查、CPU和JVM堆栈跟踪等。这个"visualvm插件集合.rar"文件似乎包含了一些专门针对GC(Garbage Collection...
**VisualVM** 是一款由Sun Microsystems(现已被Oracle收购)开发的免费、开源的工具,用于监视和调试基于Java的应用程序。它集成了多种原本独立存在的命令行工具,如`jstat`, `JConsole`, `jstack`, `jmap`, 和 `...
其次,VisualVM提供了线程监控功能,允许用户查看所有活动线程的状态,包括它们的堆栈跟踪,这对于排查死锁和线程阻塞问题非常有帮助。同时,它还能展示CPU使用率,帮助定位可能导致高CPU负载的原因。 在性能分析...
3. **线程分析**:提供线程可视化,帮助开发者查看线程的执行状态、死锁检测,以及线程堆栈跟踪,对多线程程序进行调试。 4. **采样分析**:通过对CPU和方法的采样,VisualVM能显示哪些代码段消耗了最多的资源,有...
3. **线程诊断**: 当应用出现线程阻塞或死锁时,VisualVM能帮助调试线程状态,查看线程的堆栈跟踪,找出问题的根源。 4. **类和方法剖析**: 可以分析哪些类和方法是性能瓶颈,通过方法调用树展示程序的执行路径,...
### JVM工具、参数调优与调试技巧 #### 一、JVM工具 ##### 1. jps:虚拟机进程状况工具 - **简介**:`jps` 是一个用于显示当前运行的所有Java虚拟机进程(JVMs)的简单工具。它会列出每个JVM的PID(进程ID)以及...
在Java世界中,深入理解和优化应用性能是至关重要的,而VisualVM就是这样一个强大的助手,帮助我们进行性能分析、内存调试以及线程检查等任务。接下来,我们将深入探讨VisualVM的功能、使用方法以及其在JVM分析中的...
6. **方法跟踪**:对于更深入的性能分析,VisualVM提供了方法级别的追踪,可以显示每个方法的调用次数和耗时,帮助识别性能热点。 7. **插件扩展**:VisualVM拥有丰富的插件生态系统,可以通过安装插件来扩展其功能...
VisualVM允许用户查看堆内存使用情况、跟踪对象分配、监视线程状态,并且可以与其他JVM诊断工具如JConsole和JProfiler集成。 在压缩包子文件的文件名称列表中,只有一个条目...
VisualVM可以列出应用中的所有线程,并提供线程堆栈跟踪,帮助开发者理解线程的执行路径和阻塞状态,从而发现并解决线程死锁或竞态条件等问题。 6. **JMX集成**: 通过JMX(Java Management Extensions)接口,...
VisualVM是一款强大的Java应用程序性能分析工具,尤其在处理多线程问题时非常实用。它随JDK 6 Update 7及更高版本提供,并且支持多种功能,如性能监控、内存分析、线程跟踪、堆转储和MBean操作。 VisualVM的主要...
综上所述,VisualVM作为一款强大的Java性能分析工具,其强大的内存监控、线程分析、CPU性能跟踪等功能,以及丰富的插件生态系统,为Java开发者提供了全面、直观的性能优化手段。无论是新手还是经验丰富的开发者,都...
VisualVM是一款强大的Java性能分析工具,它允许开发者深入了解JVM(Java虚拟机)的运行情况。BTrace是VisualVM的一个插件,它提供了一种安全、动态的方式,用于在生产环境中对正在运行的Java应用程序进行代码跟踪和...
Java VisualVM是一款强大的多用途工具,它为Java开发者提供了丰富的功能,包括性能分析、内存检测、线程诊断等。VisualVM是由Oracle公司开发并随JDK一同提供的,它基于JDK的jconsole和其他一些工具集成,是理解Java...