VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优
属于jdk自带的软件,在目录%HOME%\bin\jvisualvm.exe
安装插件
我这里设置的:https://visualvm.github.io/archive/uc/8u40/updates.xml.gz
显示可以安装的插件
这是我已经安装的软件,后面演示需要的
与jconsole差不多功能
jvisualvm包括了jconsole的大部分功能,可以这么理解,jvisualvm是之后的版本,可扩展性更好
dump文件生成
可以生成Thread与Head的dump文件
这是Heap的
这是Thread的
BTrace动态日志跟踪
准备测试代码
public class BTraceTest {
public int add(int a, int b) {
return a + b;
}
public void run(){
int a = (int) (Math.random() * 1000);
int b = (int) (Math.random() * 1000);
System.out.println(add(a, b));
}
public static void main(String[] args) throws IOException {
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
BTraceTest bTraceTest=new BTraceTest();
bReader.readLine();
for (int i = 0; i < 10; i++) {
bTraceTest.run();
}
}
}
运行测试一下,我们发现只能看到输出结果,那么我们在不改动源代码的情况下是否能看到变量a,b的值呢
我们借助JVisualVM的BTrace
编写程序
/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript {
/* put your code here */
@BTrace
public class TracingScript {
@OnMethod(
clazz="priv.dengjili.day.test.jvm.BTraceTest",
method="add",
location = @Location(Kind.RETURN)
)
public static void func(@Self priv.dengjili.day.test.jvm.BTraceTest instance,int a,int b, @Return int result){
println("调用栈:");
jstack();
println(strcat("方法参数 A:",str(a)));
println(strcat("方法参数B:",str(b)));
println(strcat("结果:",str(result)));
}
}
}
复制到BTrace中,点击start,再控制台中输入随意的字符
原程序正常运行
查看BTrace,查看a、b变量
完成输出如下
** Compiling the BTrace script ...
*** Compiled
** Instrumenting 1 classes ...
*** Done
** BTrace up&running
*** Done
** BTrace up&running
调用栈:
priv.dengjili.day.test.jvm.BTraceTest.add(BTraceTest.java:15)
priv.dengjili.day.test.jvm.BTraceTest.run(BTraceTest.java:20)
priv.dengjili.day.test.jvm.BTraceTest.main(Unknown Source)
方法参数 A:289
方法参数B:639
结果:928
调用栈:
priv.dengjili.day.test.jvm.BTraceTest.add(BTraceTest.java:15)
priv.dengjili.day.test.jvm.BTraceTest.run(BTraceTest.java:20)
priv.dengjili.day.test.jvm.BTraceTest.main(Unknown Source)
方法参数 A:170
方法参数B:827
结果:997
调用栈:
priv.dengjili.day.test.jvm.BTraceTest.add(BTraceTest.java:15)
priv.dengjili.day.test.jvm.BTraceTest.run(BTraceTest.java:20)
priv.dengjili.day.test.jvm.BTraceTest.main(Unknown Source)
方法参数 A:758
方法参数B:452
结果:1210
调用栈:
priv.dengjili.day.test.jvm.BTraceTest.add(BTraceTest.java:15)
priv.dengjili.day.test.jvm.BTraceTest.run(BTraceTest.java:20)
priv.dengjili.day.test.jvm.BTraceTest.main(Unknown Source)
方法参数 A:521
** BTrace has stopped
** BTrace has stopped