注意:
VisualVM has also been distributed in Oracle JDK 6~8 as Java VisualVM. It has been discontinued in Oracle JDK 9. See the Upgrading Java VisualVM page to learn how to upgrade to the latest VisualVM.
原来从jdk 9开始, visualVM不再集成在Oracle JDK中, 需要单独下载安装
下载地址: https://visualvm.github.io/download.html
下载之后,解压到JDK目录下,层级对应覆盖即可。然后在如图位置进行配置。(如果setting中没有图中的设置,请到plugins中下载"VisualVM Launcher"插件)
可视化简直太棒了
使用
一.生成、浏览堆转储快照
生成对应的堆转储文件
通过左侧列表可以查看到当前堆转储文件节点,并且可以进行相应的保存等操作,同时可以通过File菜单中load进行已保存的堆转储文件的加载
二.Btrace使用
示例代码
package com.good.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo2 {
public int add(int a, int b) {
return a + b;
}
public static void main(String[] args) throws IOException, InterruptedException {
Demo2 test = new Demo2();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 10000; i++) {
reader.readLine();
int a = (int) Math.round(Math.random() * 1000);
int b = (int) Math.round(Math.random() * 1000);
System.out.println(test.add(a, b));
}
}
}
可以在idea中以VisualVM方式运行
找到对应进程节点,右键打开Tracce Application然后进行代码插入编写
/* BTrace Script Template */
import org.openjdk.btrace.core.annotations.*;
import static org.openjdk.btrace.core.BTraceUtils.*;
@BTrace
public class TracingScript {
/* put your code here */
@OnMethod(clazz="com.good.test.Demo2", method="add", location=@Location(Kind.RETURN))
public static void func(@Self com.good.test.Demo2 instance,int a, int b,@Return int result) {
println("调用堆栈:");
jstack();
println(strcat("方法参数A:",str(a)));
println(strcat("方法参数B:",str(b)));
println(strcat("方法结果:",str(result)));
}
}
点击start后可以通过不断输入字符回车发现我们插入的日志已经显示出来了
这个场景非常适用不用停止服务器进行异常数据排查