Java 虚拟机诊断利器

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 本篇关于Arthas的使用其实很少,我只是因为学到这个地方简单的用了下,但是已经感受到了 Arthas 的强大之处,它甚至还支持 web 界面。。。相当厉害!

作者 | 小白一只

【Arthas 官方社区正在举行征文活动,参加即有奖品拿~点击投稿

1.png

背景

最近学习Java字节码过程中遇到了反射,有段代码是这样的:

package com.example.classstudy;

import java.lang.reflect.Method;

/**
 * @author TY
 */
public class ReflectionTest {

    private static int count = 0;
    public static void foo() {
        new Exception("test#" + (count++)).printStackTrace();
    }

    public static void main(String[] args) throws Exception {
        Class<?> clz = Class.forName("com.example.classstudy.ReflectionTest");
        Method method = clz.getMethod("foo");
        for (int i = 0; i < 20; i++) {
            method.invoke(null);
        }
    }
}

就是一段简单的反射调用 foo 方法,执行 20 次,然后看执行结果:

2.png

可以看到在 15 次调用 foo 方法后,第 16 次调用 foo 方法是走的 GeneratedMethodAccessor1 来调用的。我嘞个擦,怎么回事,调着调着就不一样了,于是跟代码,跟到了下面这个类:

3.png

其中这句代码就是对反射调用的次数做了控制


if (++this.numInvocations > ReflectionFactory.inflationThreshold() 
&& !ReflectUtil.isVMAnonymousClass(
this.method.getDeclaringClass())) {
            MethodAccessorImpl var3 = (MethodAccessorImpl)
            (new MethodAccessorGenerator())
            .generateMethod(this.method.getDeclaringClass(), 
            this.method.getName(), 
            this.method.getParameterTypes(), 
            this.method.getReturnType(), 
            this.method.getExceptionTypes(), 
            this.method.getModifiers());
            this.parent.setDelegate(var3);
        }

this.numInvocations 的默认值是 0,而 ReflectionFactory.inflationThreshold() 默认是 15,当大于 15 的时候会通过 ASM 技术动态生成 GeneratedMethodAccessor1 类来调用 invoke 方法,但是,因为是动态生成的,我们怎么才能看到这个类实际长什么样子呢?

Arthas

这个时候,就可以用上阿里的 arthas(阿尔萨斯)了。

4.png

首先下载 arthas:

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

然后启动 arthas:

java -jar arthas-boot.jar

启动之后界面长这个样子:

5.png

其中什么 23012, 28436 等是当前环境中现有的 java 进程,然后需要连接到哪个进程就输前面的编号(1234 啥的),输了之后回车。那么我首先改写一下最开始的那个程序,让他不退出:

package com.example.classstudy;

import java.lang.reflect.Method;

/**
 * @author TY
 */
public class ReflectionTest {

    private static int count = 0;
    public static void foo() {
        new Exception("test#" + (count++)).printStackTrace();
    }

    public static void main(String[] args) throws Exception {
        Class<?> clz = Class.forName("com.example.classstudy.ReflectionTest");
        Method method = clz.getMethod("foo");
        for (int i = 0; i < 20; i++) {
            method.invoke(null);
        }

        System.in.read();
    }
}

重新启动程序之后,查看 arthas 界面:

6.png

可以看到 32480 正是我们运行的程序,输入编号 2 去连接到该进程:

7.png

然后就可以将动态生成的类 dump 下来:

dump sun.reflect.GeneratedMethodAccessor1

8.png

可以看到字节码被 dump 下来了,找到该文件用 javap 来查看:

javap -c -v -p -l GeneratedMethodAccessor1.class

9.png

没有问题,可以查看到,然后剩下的就是人肉翻译字节码啦。。。

本篇关于Arthas的使用其实很少,我只是因为学到这个地方简单的用了下,但是已经感受到了 Arthas 的强大之处,它甚至还支持 web 界面。。。

10.png

相当厉害!

Arthas 征文活动火热进行中

Arthas 官方正在举行征文活动,如果你有:

  • 使用 Arthas 排查过的问题
  • 对 Arthas 进行源码解读
  • 对 Arthas 提出建议
  • 不限,其它与 Arthas 有关的内容

欢迎参加征文活动,还有奖品拿哦~点击投稿

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

相关文章
|
10天前
|
Arthas 监控 Java
Java 诊断利器 Arthas使用
Java 诊断利器 Arthas使用
|
1月前
|
存储 Java 数据安全/隐私保护
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
35 0
|
21天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
60 0
|
3月前
|
Linux Windows
FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
156 0
|
1月前
|
存储 Java 开发者
深入理解Java虚拟机(JVM)内存管理
【2月更文挑战第11天】 在本篇文章中,我们将深入探讨Java虚拟机(JVM)的内存管理机制,一项对于优化Java应用性能至关重要的技术领域。不同于常规的技术文章摘要,我们不仅概述了JVM内存管理的基本概念,还将引导读者通过实际案例理解其在现实世界应用中的重要性。从堆(Heap)和栈(Stack)的区别开始,到垃圾收集(Garbage Collection)机制的工作原理,本文旨在为Java开发者提供一个清晰、系统的JVM内存管理知识框架,帮助他们在开发过程中做出更加明智的决策。
|
2月前
|
存储 算法 Java
Java虚拟机内存管理机制
【2月更文挑战第7天】本文主要介绍了Java虚拟机内存管理机制的基本原理和实现方式。Java虚拟机的内存管理机制是Java程序运行的重要组成部分,对程序性能和稳定性有着直接的影响。文章首先从Java虚拟机内存模型入手,介绍了Java虚拟机中堆内存、方法区、栈、PC寄存器等内存区域的功能特点和使用方式;然后详细阐述了Java虚拟机内存管理机制的垃圾回收算法和回收器的分类、优化和实现过程;最后介绍了一些常见的内存问题和优化技巧,以及如何通过代码调优和合理使用内存配置参数来提高程序的性能和稳定性。
|
3月前
|
安全 前端开发 Java
【JVM】<Java虚拟机>JVM架构&各种**虚拟机
【1月更文挑战第26天】【JVM】<Java虚拟机>JVM架构&各种**虚拟机
|
3月前
|
自然语言处理 Oracle Java
【JVM】<Java虚拟机>JVM和JAVA体系结构
【1月更文挑战第26天】【JVM】<Java虚拟机>JVM和JAVA体系结构
|
Arthas 监控 Java
初始Java诊断工具-Arthas
初始Java诊断工具-Arthas
初始Java诊断工具-Arthas
|
1天前
|
安全 Java
java多线程(一)(火车售票)
java多线程(一)(火车售票)