Jvisualvm探索:插件安装、类加载速度调优、BTrace

时间:2022-12-21 10:48:44

一、插件安装

visualvim插件网址:http://visualvm.github.io/plugins.html

jvisualvm是随jdk一同发布的jvm诊断工具,通过插件可以扩展很多功能,插件扩展也是jvisualvm的精华所在。
打开该工具,通过菜单“工具”—>“插件”开发以下对话框:
Jvisualvm探索:插件安装、类加载速度调优、BTrace
在可用插件tab中选择需要安装的插件,本博文中需要用到两个插件如上图中的方框所示。

二、调整IDEA类加载速度

本部分的时间测量用到插件Visual GC

IDEA在启动时,由于加载很多的类,占用了较长的时间,其实在加载这些类时,还有很重要的一步就是验证这些加载的类。平时我们都是在组内开发工程,可以认为这些加载的编译代码是可靠的,不需要在加载的视乎再进行字节码验证。我们可以通过参数-Xverify:none禁止字节码验证,加快IDEA的启动过程。
这个参数要加载IDEA的配置文件中,一般情况下,配置文件在个人目录下:
Jvisualvm探索:插件安装、类加载速度调优、BTrace
修改后的配置文件如下:

-Xms512m
-Xmx1500m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:MaxJavaStackTraceDepth=-1
-agentlib:yjpagent64=probe_disable=*,disablealloc,disabletracing,onlylocal,disableexceptiontelemetry,delay=10000,sessionname=IntelliJIdea2017.2
-Xverify:none

这些参数也可在jvisualvm的概述面板下看到:
Jvisualvm探索:插件安装、类加载速度调优、BTrace

通过添加参数-Xverify:none配置后,类加载速度提高30s以上。可以通过visual vm插件面板查看:
Jvisualvm探索:插件安装、类加载速度调优、BTrace

根据visual vm中面板的显示内容,我们还可以调整jvm堆的设置,尽情探索吧~

三、BTrace

1、BTrace有两种用法:一种做为jvisualvm中插件的方式使用,另一种为单独使用btrace二进制分发包的方式。
2、单独使用BTrace github: https://github.com/btraceio/btrace
3、btrace代码自动生成工具(使用必备):https://btrace.org/btrace/?spm=5176.100239.blogcont7569.12.ndJs5r

jvisualvm插件方式获取返回值,参数等信息

1.测试代码

public class JdkTest {
public int add(int a, int b) {
return a + b;
}

public static void main(String[] args) throws IOException {
JdkTest traceTest = new JdkTest();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
reader.readLine();
int a = (int)Math.round(Math.random() * 1000);
int b = (int)Math.round(Math.random() * 1000);
System.out.println(traceTest.add(a, b));
}
}

2.BTrace
运行测试代码,在jvisualvm中会出现JdkTest的进程号,右键“Tracing Application…”,添加如下btrace代码:

/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript {
/* put your code here */
@OnMethod(
clazz="JdkTest",
method="add",
location=@Location(Kind.RETURN))

public static void func(@Self JdkTest instance,int a, int b, @Return int result){
println("调用堆栈:");
jstack();
println(strcat("方法参数A:",str(a)));
println(strcat("方法参数B:",str(b)));
println(strcat("方法结果:",str(result)));
}
}

得到如下图:
Jvisualvm探索:插件安装、类加载速度调优、BTrace
单击start,在output面板中出现如下提示:

** Compiling the BTrace script ...
*** Compiled
** Instrumenting 1 classes ...
*** Done
** BTrace up&running

*** Done
** BTrace up&running

此时,回到idea中,在ieda控制台下会看到如下提示:

btrace DEBUG: debugMode is true
btrace DEBUG: startupRetransform is true
btrace DEBUG: dumpClasses is true
btrace DEBUG: dumpDir is C:\Users\zjw94377\AppData\Local\Temp\
btrace DEBUG: trackRetransforms is true
btrace DEBUG: unsafeMode is false
btrace DEBUG: probe descriptor path is .
btrace DEBUG: stdout is false
btrace DEBUG: starting agent thread
btrace DEBUG: starting server at 61255
btrace DEBUG: waiting for clients
btrace DEBUG: client accepted Socket[addr=/127.0.0.1,port=61257,localport=61255]
btrace DEBUG: got instrument command
btrace DEBUG: loading BTrace class
btrace DEBUG: verifying BTrace class ...
btrace DEBUG: BTrace class TracingScript verified
btrace DEBUG: preprocessing BTrace class TracingScript ...
btrace DEBUG: ... preprocessed
btrace DEBUG: loaded 'TracingScript' successfully
btrace DEBUG: creating BTraceRuntime instance for TracingScript
btrace DEBUG: created BTraceRuntime instance for TracingScript
btrace DEBUG: sending Okay command
btrace DEBUG: client TracingScript: got com.sun.btrace.comm.OkayCommand@7612cdd3
btrace DEBUG: about to defineClass TracingScript
btrace DEBUG: defineClass succeeded for TracingScript
btrace DEBUG: starting client command handler thread
btrace DEBUG: new Client created com.sun.btrace.agent.RemoteClient@65bfa95f
btrace DEBUG: retransforming loaded classes
btrace DEBUG: filtering loaded classes
btrace DEBUG: candidate class JdkTest added
btrace DEBUG: client TracingScript: got com.sun.btrace.comm.RetransformationStartNotification@e69ee88
btrace DEBUG: calling retransformClasses (1 classes to be retransformed)
btrace DEBUG: client TracingScript: got com.sun.btrace.comm.RetransformClassNotification@2364d094
btrace DEBUG: transformed class JdkTest
btrace DEBUG: waiting for clients
btrace DEBUG: client TracingScript: got com.sun.btrace.comm.OkayCommand@299cbbe4

随意输入一个数字后,回到jvisualvm中,在output面板中会出现如下结果:

** Compiling the BTrace script ...
*** Compiled
** Instrumenting 1 classes ...
*** Done
** BTrace up&running

*** Done
** BTrace up&running

调用堆栈:
JdkTest.add(JdkTest.java:11)
JdkTest.main(JdkTest.java:20)
方法参数A:943
方法参数B:61
方法结果:1004
** BTrace has stopped
** BTrace has stopped

单独使用Btrace获取返回值,参数等信息

1.把上面的btrace代码保存为TracingScript.java
2、采用如下的方式运行:
Jvisualvm探索:插件安装、类加载速度调优、BTrace
也可得到结果(其中21972为测试程序JdkTest运行时的进程号)。

btrace补充

1、Btrace详细指南:https://yq.aliyun.com/articles/7569
2、BTrace注解:https://github.com/btraceio/btrace/wiki/BTrace-Annotations?spm=5176.100239.blogcont7569.22.IB84VP