help
sysprop 可以打印所有的System Properties信息。、
sc 命令可以查找到所有JVM已经加载到的类。 如果搜索的是接口,还会搜索所有的实现类。比如查看所有的Filter实现类:
sm
sm命令则是查找类的具体函数。比如:

  1. sc javax.servlet.Filter
  2. sm java.math.RoundingMode

Jad

Jad

可以通过 jad 命令来反编译代码:

  1. jad com.example.demo.arthas.user.UserController


通过--source-only参数可以只打印出在反编译的源代码:

  1. jad --source-only com.example.demo.arthas.user.UserController

Ognl
在Arthas里,有一个单独的ognl命令,可以动态执行代码。

  1. ognl '@java.lang.System@out.println("hello ognl")'

调用static函数
watch

  1. watch com.example.demo.arthas.user.UserController * '{params, throwExp}'

  1. 第一个参数是类名,支持通配
  2. 第二个参数是函数名,支持通配 访问 curl http://localhost:61000/user/0 ,watch命令会打印调用的参数和异常

jad/mc/redefine热更新代码

thread 查找Top N线程

案例: 获取Spring Context

在这个案例里,展示获取spring context,再获取bean,然后调用函数。

使用tt命令获取到spring context

tt即 TimeTunnel,它可以记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。

  • https://arthas.aliyun.com/doc/tt.html
    1. tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod

    访问:user/1
    可以看到tt命令捕获到了一个请求: ``` $ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdaptePress Q or Ctrl+C to abort. Affect(class-cnt:1 , method-cnt:1) cost in 252 ms. INDE TIMESTAMP COST( IS-R IS- OBJECT CLASS METHOD X ms) ET EXP

1000 2019-02-15 4.583 true fal 0xc93cf1a RequestMappingHand invokeHandlerMethod 15:38:32 923 se lerAdapter

  1. <a name="zH86G"></a>
  2. #### 使用tt命令从调用记录里获取到spring context
  3. 输入 `q` 或者 `Ctrl + C` 退出上面的 `tt -t`命令。

q

tt -i 1000 -w ‘target.getApplicationContext()’

$ tt -i 1000 -w ‘target.getApplicationContext()’ @AnnotationConfigEmbeddedWebApplicationContext[ reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@2e457641], scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@6eb38026], annotatedClasses=null, basePackages=null, ] Affect(row-cnt:1) cost in 439 ms.

  1. <a name="ust95"></a>
  2. ### 获取spring bean,并调用函数

tt -i 1000 -w ‘target.getApplicationContext().getBean(“helloWorldService”).getHelloMessage()’

  1. <br />结果是:

$ tt -i 1000 -w ‘target.getApplicationContext().getBean(“helloWorldService”).getHelloMessage()’ @String[Hello World] Affect(row-cnt:1) cost in 52 ms. ```

线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。