arthas的基础学习_rhyme-编程思维

 下载与安装 

wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

  

启动

查看启动的帮助信息:

java -jar arthas-boot.jar -h

  

 

注意:arthas目前只支持本地调试(即你本机的arthas无法调试另一台机器上的Java进程)。

 

一个小例子

下载一个demo并启动这个demo项目

wget https://alibaba.github.io/arthas/arthas-demo.jar
java -jar arthas-demo.jar

  

再启动"arthas"

java -jar arthas-boot.jar

  

接着输入"1",表示你想要查看"arthas-demo"

此时,进入了"arthas"查看"arthas-demo"的控制台

 

输入"dashboard"

每5s会更新信息

 

"Ctrl+C"退出dashboard

通过thread命令来获取到arthas-demo进程的Main Class

thread 1

  

 

thread 1 | grep 'main('

  

 

通过jad来反编译Main Class

jad 包名.类名

  

$ jad demo.MathGame
 
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@3d4eac69
  +-sun.misc.Launcher$ExtClassLoader@66350f69
 
Location:
/tmp/arthas-demo.jar
 
/*
 * Decompiled with CFR 0_132.
 */
package demo;
 
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
 
public class MathGame {
    private static Random random = new Random();
    private int illegalArgumentCount = 0;
 
    public static void main(String[] args) throws InterruptedException {
        MathGame game = new MathGame();
        do {
            game.run();
            TimeUnit.SECONDS.sleep(1L);
        } while (true);
    }
 
    public void run() throws InterruptedException {
        try {
            int number = random.nextInt();
            List<Integer> primeFactors = this.primeFactors(number);
            MathGame.print(number, primeFactors);
        }
        catch (Exception e) {
            System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage());
        }
    }
 
    public static void print(int number, List<Integer> primeFactors) {
        StringBuffer sb = new StringBuffer("" + number + "=");
        Iterator<Integer> iterator = primeFactors.iterator();
        while (iterator.hasNext()) {
            int factor = iterator.next();
            sb.append(factor).append('*');
        }
        if (sb.charAt(sb.length() - 1) == '*') {
            sb.deleteCharAt(sb.length() - 1);
        }
        System.out.println(sb);
    }
 
    public List<Integer> primeFactors(int number) {
        if (number < 2) {
            ++this.illegalArgumentCount;
            throw new IllegalArgumentException("number is: " + number + ", need >= 2");
        }
        ArrayList<Integer> result = new ArrayList<Integer>();
        int i = 2;
        while (i <= number) {
            if (number % i == 0) {
                result.add(i);
                number /= i;
                i = 2;
                continue;
            }
            ++i;
        }
        return result;
    }
}
 
Affect(row-cnt:1) cost in 970 ms.

 

watch

watch 包名.类名 方法名 returnObj

 

多使用"tab"键,会自动补全。

通过watch命令来查看demo.MathGame#primeFactors函数当前的返回值,注意是当前,如果该函数没有被执行,就不会有信息输出

更多的功能可以查看进阶使用

 

Sc

可以通过 sc 命令来查找JVM里已加载的类:

 

 

 退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行shutdown命令。

 

 

来源:https://alibaba.github.io/arthas/install-detail.html

 

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/theRhyme/p/10658218.html

java8 optional的简单操作_rhyme-编程思维

我们经常会遇到这种情况:首先判断一个对象是否为null,如果不为null,获取一个对象中的一个属性,如果该属性不为null,又获取该属性的属性,如果该属性的属性不为null,又获取属性的属性的属性; 使用Java8中类Optional优雅解决   例子 一个pojo类; 该类有两个属性,有个属性Project是对象,P

java8自定义函数式编程接口和便捷的引用类的构造器及方法_rhyme-编程思维

什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equals),不算是函数式接口的方法。 被@FunctionalInterface注解该接口,没有该注解的接口满足约束也行。   在Java8中,满足下面任意一个条件的接口都是函数式接口: 

clash for windows 使用教程(详解,全流程)_牛奔-编程思维

1、简介 Clash 是一个使用 Go 语言编写,基于规则的跨平台代理软件核心程序。 Clash for Windows 是目前在 Windows 上唯一可用的图形化 Clash 分支。通过 Clash API 来配置和控制 Clash 核心程序,便于用户可视化操作和使用。 2、下载地址 点击前往下载 https://

性能优化必备——火焰图_是咕咕鸡-编程思维

引言 本文主要介绍火焰图及使用技巧,学习如何使用火焰图快速定位软件的性能卡点。 结合最佳实践实战案例,帮助读者加深刻的理解火焰图构造及原理,理解 CPU 耗时,定位性能瓶颈。 背景 当前现状 假设没有火焰图,你是怎么调优程序代码的呢?让我们来捋一下。 1. 功能开关法 想当年我刚工作,还是一个技术小白时,排查问题只能靠