一、插件安装
visualvim插件网址:http://visualvm.github.io/plugins.html
jvisualvm是随jdk一同发布的jvm诊断工具,通过插件可以扩展很多功能,插件扩展也是jvisualvm的精华所在。
打开该工具,通过菜单“工具”—>“插件”开发以下对话框:
在可用插件tab中选择需要安装的插件,本博文中需要用到两个插件如上图中的方框所示。
二、调整IDEA类加载速度
本部分的时间测量用到插件Visual GC
。
IDEA在启动时,由于加载很多的类,占用了较长的时间,其实在加载这些类时,还有很重要的一步就是验证这些加载的类。平时我们都是在组内开发工程,可以认为这些加载的编译代码是可靠的,不需要在加载的视乎再进行字节码验证。我们可以通过参数-Xverify:none
禁止字节码验证,加快IDEA的启动过程。
这个参数要加载IDEA的配置文件中,一般情况下,配置文件在个人目录下:
修改后的配置文件如下:
-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的概述
面板下看到:
通过添加参数-Xverify:none
配置后,类加载速度提高30s以上。可以通过visual vm
插件面板查看:
根据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)));
}
}
得到如下图:
单击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、采用如下的方式运行:
也可得到结果(其中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