基础
Java
Java
  • 基础知识
    • Java 语言的特点
    • Java 基础
      • 语法基础
      • 类型
      • 泛型
      • 注解
      • 异常
      • 反射机制
      • Java 容器
    • Java IO
      • 基础IO
      • NIO
    • Java 并发
      • Java 内存模型
        • 主内存与工作内存
        • 对于 volatile 型变量的特殊规则
        • long 和 double 的非原子性协定
        • 原子性、可见性与有序性
        • 先行发生(Happens-Before)原则
      • 线程
        • 状态转换
        • 线程安全性
          • 对象的共享
            • 可见性
            • 线程封闭
            • 不可变性
            • 安全发布
          • 在现有的线程安全类中添加功能
        • 线程池
          • Executor 框架
          • ExecutorService
          • Executors
          • Future
          • CompletionService
          • 设置线程池的大小
          • ThreadPoolExecutor
      • 线程安全的容器
        • 同步容器类
        • 并发容器
          • ConcurrentHashMap
          • CopyOnWriteArrayList
          • BlockingQueue
            • 串行线程封闭
            • 双端队列与工作密取
      • 任务取消
        • 自定义的取消标志
        • 线程中断
        • 通过 Future 来实现取消
      • 条件队列
        • 内置条件队列
        • 显式的 Condition 对象
      • JUC 中的 AQS
        • AbstractQueuedSynchronizer
        • ReentrantLock
        • ReentrantReadWriteLock
        • Semaphore
        • CountDownLatch
      • 原子变量
        • CAS
        • 原子变量类
        • ABA 问题
        • 非阻塞算法
          • 非阻塞的栈
          • 非阻塞的链表(X)
    • Java 虚拟机
      • JVM 的运行机制
      • 类加载器
      • 运行时数据区
        • JVM 的内存区域
        • 永久代与元空间
        • OutOfMemoryError
      • Java 中的 4 种引用类型
      • 垃圾收集(GC)
        • 如何确定垃圾
        • 垃圾回收算法
        • 垃圾收集器
          • Serial 收集器
          • ParNew 收集器
          • Parallel Scavenge 收集器
          • Serial Old 收集器
          • Parallel Old 收集器
          • CMS 收集器
          • Garbage First 收集器
  • Group 1
    • JDK 与 JRE
    • JVM默认配置
    • java与HTTPS
    • 构建高效且可伸缩的结果缓存
    • 基础补充
      • 在 Switch 中使用 String
      • 为什么 Java 语言不支持多重继承?
      • 为什么在重写 equals 方法的时候需要重写 hashCode 方法
      • 为什么 String 要设计为不可变的?
      • 移位运算符
      • SPI 机制
      • 为何 HashMap 不是线程安全的
      • Class.forName() 和ClassLoader.loadClass() 区别
      • synchronized 关键字
    • 零拷贝
    • Java中的锁优化技术
      • 自旋锁与自适应自旋
      • 锁消除
      • 锁粗化
      • 轻量级锁
      • 偏向锁
    • Arthas
    • Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()
由 GitBook 提供支持
在本页
  • 查看最繁忙的线程,以及是否有阻塞情况发生
  • 确认某个类是否已被系统加载
  • 查看一个 class 类的源码信息(反编译)
  • 跟踪某个方法的返回值、入参
  • 查看方法调用栈的信息
  • 到最耗时的方法调用
  • 临时更改代码运行
  • 测试某个方法的性能问题
  • 使用 Idea 的远程调试
  1. Group 1

Arthas

上一页偏向锁下一页Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()

最后更新于9个月前

官网文档:

查看最繁忙的线程,以及是否有阻塞情况发生

场景:我想看下查看最繁忙的线程,以及是否有阻塞情况发生?

thread -n 3 # 查看最繁忙的三个线程栈信息
thread      # 以直观的方式展现所有的线程情况
thread -b   # 找出当前阻塞其他线程的线程

确认某个类是否已被系统加载

场景:我新写了一个类或者一个方法,我想知道新写的代码是否被部署了?

# 找到需要的类全路径(如果存在的话), 会返回类的所有子类
sc *.MathGame

# 查看这个某个类所有的方法
sm demo.MathGame *

# 查看某个方法的信息,如果存在的话
sm demo.MathGame print

查看一个 class 类的源码信息(反编译)

场景:我新修改的内容在方法内部,而上一个步骤只能看到方法,这时候可以反编译看下源码

# 直接反编译出 java 源代码,包含一此额外信息的
jad demo.MathGame

跟踪某个方法的返回值、入参

场景:我想看下我新加的方法在线运行的参数和返回值?

# 同时监控入参,返回值,及异常
watch demo.MathGame print "{params, returnObj, throwExp}" -e -x 2 

查看方法调用栈的信息

场景:我想看下某个方法的调用栈的信息?

stack demo.MathGame print

运行此命令之后需要及时触发方法才会有响应的信息打印在控制台上

到最耗时的方法调用

场景:testMethod 这个方法入口响应很慢,如何找到最耗时的子调用?

# run 是 MathGame 中的一个方法
trace demo.MathGame run

临时更改代码运行

场景:我找到了问题所在,能否线上直接修改测试,而不需要在本地改了代码后,重新打包部署,然后重启观察效果?

# 先反编译出class源码
jad --source-only demo.MathGame > MathGame.java  

# 然后使用外部工具编辑内容
mc MathGame.java -d .  # 再编译成class, -d 指定输出目录

# 最后,重新载入定义的类,就可以实时验证你的猜测了
retransform demo/MathGame.class

测试某个方法的性能问题

monitor -c 5 demo.MathGame primeFactors

使用 Idea 的远程调试

要让远程服务器运行的代码支持远程调试,则启动的时候必须加上特定的 JVM 参数,这些参数是:

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=127.0.0.1:5555
https://arthas.aliyun.com/doc/