`
还可以
  • 浏览: 80964 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

btrace的使用与jvm简介

阅读更多

关于btrace的使用总结

使用步骤:

一、下载btrace包:btrace-agent.jarbtrace-boot.jarbtrace-client.jar

二、在环境变量中配置BTRACE_HOME。在PATH中添加BIN目录的路径。

三、运行要测试的web应用,这里使用本机上的web应用做测试例子。

四、jps获取当前进程id

五、编写btrace监控脚本监控web应用中特定类的运行情况。

六、使用btrace <pid> 脚本程序.java 运行监控脚本,查看特定类的运行状况,将具体情况写入日志。

 

自己的测试例子:

2、  这里测试的是监控某个类init的调用状况。

3、  编写的btrace脚本:

package com.btrace.demo;

import static com.sun.btrace.BTraceUtils.print;   

import static com.sun.btrace.BTraceUtils.printArray;   

import static com.sun.btrace.BTraceUtils.println;   

import static com.sun.btrace.BTraceUtils.probeClass;   

import static com.sun.btrace.BTraceUtils.probeMethod;

import com.sun.btrace.annotations.BTrace;

import com.sun.btrace.annotations.OnMethod;

@BTrace

public class BtraceDemo {

 

@OnMethod(clazz="classpath(监控类的完整路径)",method="init")

public static void test(){

      print("demo.init..............start...............");

      print("   [");   

      print(probeMethod());   

      println("]");

      print("demo.init..............start...............");

}

}

 

4、  使用jps查看jboss启动的进程id(我本机上当前的pid46812

5、  使用btrace命令启动脚本并将监控情况写入日志btrace -cp D:\btrace\build 46812 BtraceDemo.java > c:\btracelog.txt

6、  Btracelog.txt日志记录的情况:

demo.init..............start...............   [init]

demo.init..............start...............

demo.init..............start...............   [init]

demo.init..............start...............

demo.init..............start...............   [init]

demo.init..............start...............

由此可见init方法被调用了3次。

 

 

感想:btrace这种弱侵入式监控应用运行状态的工具太棒了。可以随时随地的监控online的应用和程序。而且工具小巧方便,容易入门。

 

 

关于jvm学习总结:

 

 

一个java虚拟机实例的运行过程:

1、运行java虚拟机的启动程序,设置jvm运行时的参数。

2、由启动程序去启动真正的虚拟机,也就是jre目录下的jvm.dll

3、由类装载器将编译后的文件装载进虚拟机中。

4、由执行引擎找到main方法入口,从方法区中将字节码读取到执行引擎中,并逐句开始执行。(方法区中存放的是被类装载器装载进虚拟机的class的信息,该class信息是从Class文件中读取的)。

5、在执行过程中,如果需要在main中生成某个类的对象,执行引擎会在方法区中的常量池去寻找与该类名称对应的类的信息,然后在java堆中为此对象分配内存空间。

6、当在mian方法中有调用某个对象的方法时,同样的,执行引擎会去常量池中寻找与此方法名对应的方法,并通过其中存放的字节码所在内存区域的指针去将方法字节码读入寄存器,通过执行引擎执行。在执行方法字节码的同时,由于在编译时就已经指定每个方法的操作数栈和局部变量区的大小,所以此时,执行引擎会在java栈中压入一个栈帧(java中一个线程只有一个栈,在一个线程中调用方法,方法栈会以栈帧的形式压入到当前线程拥有的栈中)。如果是调用的native方法,则在本地方法栈中压入栈帧。

 

以下是一个java source文件和其Class文件的对比描述:

1)此为java source文件

public class SimpleObj{

private Object simpleobj;

public void setSim(Object obj){

this.simpleobj = obj;

}

 

public Object getSim(){

  return simpleobj;

}

public static void main(String[] a){

    SimpleObj simple = new SimpleObj();

         simple.setSim("hello");

    String demo = (String)simple.getSim();

}

}

 

 

 

 

2)此为其对应的Class文件(使用javap –c –l –s class文件名 通过反编译得到,省略了部分)

 

Compiled from "SimpleObj.java"

此为常量池,里面存放了类的信息,包括方法、属性的详细信息。

public class SimpleObj extends java.lang.Object

  SourceFile: "SimpleObj.java"

  minor version: 0

  major version: 50

  Constant pool:

const #1 = Method  #9.#33;    //  java/lang/Object."<init>":()V

const #2 = Field        #3.#34;    //  SimpleObj.simpleobj:Ljava/lang/Object;

const #3 = class        #35; //  SimpleObj

const #4 = Method  #3.#33;    //  SimpleObj."<init>":()V

const #5 = String      #36; //  hello

const #6 = Method  #3.#37;    //  SimpleObj.setSim:(Ljava/lang/Object;)V

const #7 = Method  #3.#38;    //  SimpleObj.getSim:()Ljava/lang/Object;

const #8 = class        #39; //  java/lang/String

const #9 = class        #40; //  java/lang/Object

const #10 = Asciz     simpleobj;

此为局部变量表

 


{

public SimpleObj();

  Signature: ()V

  LineNumberTable:

   line 1: 0

 

  LocalVariableTable:

真正的字节码,stack是栈帧的大小,locals是局部变量的大小,args_size是参数的大小,这些内容在编译时期就已经确定了。

   Start  Length  Slot  Name   Signature

   0      5      0    this       LSimpleObj;

 

 

  Code:

   Stack=1, Locals=1, Args_size=1

   0:        aload_0

   1:        invokespecial   #1; //Method java/lang/Object."<init>":()V

   4:        return

  LineNumberTable:

   line 1: 0

 

  LocalVariableTable:

   Start  Length  Slot  Name   Signature

   0      5      0    this       LSimpleObj;

。。。。。。。。。。。。。。。。。。。。。。

 

}

 

 

 

关于jmap+mat的使用总结

这里我只使用了下jmapdump功能,配合mat插件的使用,看了下本机上web应用运行时内存中各个类占用内存空间的情况。

使用过程如下:

1、  jboss上运行web应用

2、  使用jps查看jboss进程id

3、  使用jmap -dump:format=b,file=liuyangyang.bin 49428    dump内存,生成二进制文件。

4、  mat中导入刚才dumpliuyangyang.bin文件。

(1)       几个大对象占用内存的大小:

 

   

 

   (2)内存中对象的查看:

 

 

 

 

 

分享到:
评论
1 楼 zzh627 2013-05-06  
btrace-agent.jar哪里下。。。

相关推荐

    BTrace监控远程服务器使用实例

    **BTrace监控远程服务器使用实例** BTrace 是一个强大的、安全的、动态的Java应用程序诊断工具,它允许开发者在运行时对Java应用进行细粒度的监控和性能分析。BTrace利用了Java的动态代理机制(Java Agent)和ASM...

    jdk1.8-Btrace.rar

    通常,这样的包会包含Btrace的二进制文件、文档、示例脚本以及可能的配置文件,方便用户在Java 1.8环境下安装和使用Btrace。用户需要先解压这个文件,然后根据文档指导进行配置和启动,以利用Btrace的功能。 在实际...

    btrace1.3.9

    1. **安装与配置**:用户需要将BTrace添加到系统路径中,然后根据具体需求配置JVM参数,例如设置`-Dcom.sun.management.jmxremote`以启用JMX,这是BTrace运行所必需的。 2. **脚本编写**:BTrace使用一种简单的脚本...

    btrace调试工具

    JVM TI允许外部工具与JVM交互,监控和改变运行中的应用。BTrace通过Java Agent API在目标类的字节码上进行操作,动态插入跟踪代码,这个过程被称为字节码增强。当类被加载时,BTrace的增强器会修改其字节码,添加...

    btrace-release-1.3.11.3.zip

    5. **可扩展性**:Btrace 支持与其他监控工具集成,例如日志记录框架、告警系统等,可以轻松地扩展其功能。 在 `btrace-release-1.3.11.3` 压缩包中,可能包含以下文件和目录: - `bin/`:包含 Btrace 的可执行...

    btrace安装包

    随着Java技术的不断进步,BTrace也在持续演进,以适应新的JVM特性和开发需求。虽然现在有一些替代工具如JMX、Java Flight Recorder等,但BTrace因其轻量级、无侵入的特点,仍然在特定场景下具有独特的价值。 7. **...

    btrace支持jdk1.6上运行的版本

    BTrace 使用 Java Agent 技术,它可以在不改变原有代码的情况下,利用 JVMTI(Java Virtual Machine Tool Interface)接口向运行中的 JVM 注入字节码。BTrace 提供了一种声明式的脚本语言,用户可以编写简单的脚本来...

    如何检测线上代码的运行情况---BTrace使用分享

    在实际使用中,我们需要将BTrace工具部署到JVM上,通过指定应用的JAR或类路径来启动BTrace。执行BTrace命令时,需要提供监控脚本(如MorganTraceTest.java)和目标应用程序的PID。一旦BTrace运行起来,它就会开始...

    BTrace实现原理

    BTrace使用这个API获取`Instrumentation`实例,进而利用ASM生成的字节码对目标类进行改造。例如,BTrace可以通过`retransformClasses`方法在运行时对已经加载的类进行重新转换,添加监控代码。 4. **Java Compiler ...

    BTrace-一个用于Java平台的安全动态的跟踪工具

    在描述中提到,BTrace与OpenSolaris上的DTrace类似,DTrace是一款强大的系统诊断工具,能够深入到操作系统内部进行性能分析。BTrace将这种能力引入到了Java世界,使得开发者可以对Java应用程序进行细粒度的性能分析...

    java程序运行跟踪利器Btrace分享

    **Btrace简介** Btrace是由Sun Microsystems开发的一个开放源码的Java运行时分析工具。它的主要功能是能够在运行中的Java应用程序中动态地插入监视代码,用于收集有关程序运行时信息,如方法调用、对象创建、线程...

    Btrace 学习1

    BTrace 利用这个机制,通过 Dynamic Code Enhancement 动态地向运行的 JVM 注入新的字节码,实现对目标类的增强。 4. **BTrace API**: BTrace 提供了一系列的内建脚本函数和注解,如 @OnMethod、@Trace、@BTrace...

    btrace java线上debug神器

    - **动态代码注入**:BTrace通过JVM字节码注入技术,在运行时向目标类添加监控代码,无需停机或重启应用。 - **自定义脚本**:BTrace使用一种基于Java的脚本语言,允许开发者编写简单的脚本来定义想要追踪的行为,...

    BTrace测试

    BTrace利用ASM库,在类加载到JVM时,将监控脚本插入到目标类的方法中,这样在方法执行时,就会触发我们设定的监控逻辑。 在进行BTrace测试时,我们需要编写BTrace脚本。BTrace脚本是基于Groovy语言的,具有丰富的...

    Java软件生产监控工具Btrace使用方法详解

    5. 获取当前JVM堆使用情况 6. 获取当前线程的执行栈 Btrace的示例代码 下面是一个使用Btrace来分析add方法的耗时情况的示例代码: ```java package com.metty.rpc.common; import java.util.Random; public ...

    BTrace的安装包Windows

    **一、BTrace简介** BTrace是基于字节码注入技术的,它通过在JVM层面上动态插入监控代码,来收集关于程序运行的信息。这种技术的优势在于,它不需要对源代码进行任何修改,也不需要重新编译或重启应用。只需要在...

    Android代码-JVM-Sandbox

    BTRACE好强大,也曾技痒想做一个更便捷、更适合自己的问题定位工具,既可支持线上链路监控排查,也可支持单机版问题定位。 有时候突然一个问题反馈上来,需要入参才能完成定位,但恰恰没有任何日志,甚至出现在别人...

    jvm-anatomy-park-complete

    文章提供了一些关于JVM内部工作原理的深入洞察,但需要指出,由于文章的快速发布的性质,内容主要是基于作者个人经验的趣闻轶事,可能没有经过正式的技术审查,因此使用和信任这些内容需要谨慎。 在给出的内容中,...

    jvm-demo1.zip

    在`jvm-demo1`中,可能包含了一段BTrace脚本,用于监控和分析JVM内部的行为,比如CPU使用率、内存分配、方法调用等。通过BTrace,开发者可以实时了解程序运行状态,找出性能瓶颈,进行针对性的优化。 在实际调优...

    BTrace二三事之二:OnMethod子类匹配BUG(怀疑)

    4. **检查JVM错误日志**:对hs_err_pid*.log文件进行分析,查找与BTrace相关的异常或错误信息。 5. **重现问题**:尝试创建一个简单的示例,复现描述中的问题,以便于调试和修复。 6. **社区求助**:如果以上步骤都...

Global site tag (gtag.js) - Google Analytics