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

一、插件安装

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值