JVM工作原理与实战(四):字节码常用工具

简介: JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了字节码常用工具javap、jclasslib、Arthas等内容。

一、javap命令

javap是JDK自带的反编译工具,它允许开发者从命令行界面查看Java字节码文件(即.class文件)的内容。这一功能在分析Java类文件、理解Java虚拟机(JVM)如何处理代码以及进行故障排查时特别有用,尤其是在没有图形用户界面的服务器环境中(Linux和Windows命令相同)。

1.javap

输入javap查看所有参数:

javap

image.gif

执行结果:

image.gif

 参数解释:

-help  --help  -? 输出此用法消息
-version 版本信息
-v  -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类和成员 (默认)
-p  -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置

2.javap -version

输入javap -version查看版本信息:

javap -version

image.gif

 执行结果:

image.gif

3.javap -v

输入javap -v 字节码文件名称查看具体的字节码信息(jar包需要先使用 jar –xvf 命令解压):

javap -v 字节码文件名称

image.gif

使用jar –xvf解压文件:

jar –xvf 字节码文件名称

image.gif

执行结果:

image.gif

image.gif

输入javap -v 查看具体的字节码信息:

javap -v D:\Test\BOOT-INF\classes\com\rye\service\BlogService.class

image.gif

执行结果:  

image.gif

通过javap -v 将具体的字节码信息转换为txt文本:

javap -v D:\Test\BOOT-INF\classes\com\rye\service\BlogService.class > D:\Test\BlobService.txt

image.gif

执行结果:

image.gif

二、jclasslib

jclasslib字节码编辑器是一款工具,它能够可视化已编译的Java类文件及其包含的字节码的所有细节。用户可以在其用户界面内编辑类文件的各个方面。除此之外,该工具还自带一个库,允许开发人员读取和写入Java类文件及字节码。使用此工具,所有常数池条目均可编辑,引用的常量池条目则可直接从属性与常量池条目的“编辑”按钮所弹出的上下文菜单中进行修改。同时,字节码指令也能通过上下文菜单进行编辑。

详细内容可以查看以下文章:

https://developer.aliyun.com/article/1483050

三、Arthas

1.介绍

Arthas是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

Arthas官方文档:

Arthas功能:

image.gif

2.下载和使用

Arthas官方下载地址:

https://arthas.aliyun.com/doc/

下载arthas-bin.zip:

image.gif

选择其中的arthas-boot.jar,放到相应的目录(根据个人情况选择):

image.gif

在启动Arthas前需要先启动一个程序(被监控的程序):

java -jar blog-0.0.1-SNAPSHOT.jar

image.gif

启动结果:

image.gif

在arthas-boot.jar的目录下打开CMD输入命令启动Arthas:

java -jar arthas-boot.jar

image.gif

启动结果,可以看到之前启动的程序(被监控的程序):

image.gif

输入1,回车,监控该程序:

image.gif

3.常用命令

Arthas官方命令文档:

https://github.com/alibaba/arthas/releases

dashboard:当前系统的实时数据面板,按 ctrl+c 退出。

参数名称 参数说明
[i:] 刷新实时数据的时间间隔 (ms),默认 5000ms
[n:] 刷新实时数据的次数

示例:

dashboard  -i 2000 -n 1

image.gif

执行结果:

image.gif

dump:dump 命令将 JVM 中实际运行的 class 的 byte code dump 到指定目录,适用场景批量下载指定包目录的 class 字节码 。

参数名称 参数说明
class-pattern 类名表达式匹配
[c:] 类所属 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[d:] 设置类文件的目标目录
[E] 开启正则表达式匹配,默认为通配符匹配

示例:

dump -d D:/Test/test java.lang.String

image.gif

 执行结果:

image.gif

image.gif

jad:反编译指定已加载类的源码。jad命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于理解业务逻辑(在 Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便)。

参数名称 参数说明
class-pattern 类名表达式匹配
[c:] 类所属 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[E] 开启正则表达式匹配,默认为通配符匹配

示例:

jad java.lang.String

image.gif

执行结果:

image.gif


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了字节码常用工具javap、jclasslib、Arthas等内容,希望对大家有所帮助。

相关文章
|
4月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
449 55
|
4月前
|
Oracle Java 关系型数据库
JVM深入原理(一+二):JVM概述和JVM功能
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行。
125 0
|
4月前
|
Arthas 存储 Java
JVM深入原理(三+四):JVM组成和JVM字节码文件
目录3. JVM组成3.1. 组成-运行时数据区3.2. 组成-类加载器3.3. 组成-执行引擎3.4. 组成-本地接口4. JVM字节码文件4.1. 字节码文件-组成4.1.1. 组成-基础信息4.1.1.1. 基础信息-魔数4.1.1.2. 基础信息-主副版本号4.1.2. 组成-常量池4.1.3. 组成-方法4.1.3.1. 方法-工作流程4.1.4. 组成-字段4.1.5. 组成-属性4.2. 字节码文件-查看工具4.2.1. javap4.2.2. jclasslib4.2.3. 阿里Arthas
89 0
|
4月前
|
存储 安全 Java
JVM深入原理(五):JVM组成和JVM字节码文件
类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析。
63 0
|
4月前
|
Arthas Java 测试技术
JVM深入原理(六)(一):JVM类加载器
目录6. JVM类加载器6.1. 类加载器-概述6.2. 类加载器-执行流程6.3. 类加载器-分类(JDK8)6.3.1. JVM底层实现的类加载器6.3.1.1. 启动类加载器6.3.2. Java代码实现类的加载器6.3.2.1. 扩展类加载器6.3.2.2. 应用程序类加载器6.4. 类加载器-Arthas查看类加载器
72 0
|
5月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
416 6
|
8月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
901 166
|
10月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1768 1
|
6月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
314 29
JVM简介—1.Java内存区域
|
6月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略