【实战JVM】-基础篇-01-JVM通识-字节码详解

news2024/11/17 9:39:06

【实战JVM】-基础篇-01-JVM通识-字节码详解-类的声明周期-加载器

  • 1 初识JVM
    • 1.1 什么是JVM
    • 1.2 JVM的功能
      • 1.2.1 即时编译
    • 1.3 常见JVM
  • 2 字节码文件详解
    • 2.1 Java虚拟机的组成
    • 2.2 字节码文件的组成
      • 2.2.1 正确打开字节码文件
      • 2.2.2 字节码组成
      • 2.2.3 基础信息
        • 2.2.3.1 魔数
        • 2.2.3.1 主副版本号
      • 2.2.4 常量池
      • 2.2.5 方法
    • 2.3 linux中打开字节码文件
    • 2.4 字节码常用工具 Arthas
      • 2.4.1 安装Arthas
      • 2.4.2 Arthas功能
        • 2.4.2.1 获取系统实时面板-dashboard
        • 2.4.2.2 加载特定类的字节码-dump
        • 2.4.2.3 反编译已加载类的源码-jad
        • 2.4.2.4 查看JVM已加载的类信息-sc


1 初识JVM

1.1 什么是JVM

在这里插入图片描述
在这里插入图片描述

1.2 JVM的功能

在这里插入图片描述

1.2.1 即时编译

即时编译Just-In-Time 简称JIT进行性能的优化,最终到达接近C、C++的性能

在这里插入图片描述
在这里插入图片描述

将热点代码转换为机器码后保存至RAM,下次执行时直接从RAM中调用。

在这里插入图片描述

1.3 常见JVM

在这里插入图片描述

java -version

在这里插入图片描述

2 字节码文件详解

2.1 Java虚拟机的组成

在这里插入图片描述

2.2 字节码文件的组成

2.2.1 正确打开字节码文件

安装jclasslib

在这里插入图片描述
打开任意一个class文件
在这里插入图片描述

2.2.2 字节码组成

  • 基础信息(一般信息+接口):

    • 魔数、字节码对应的java版本号,访问标识(public、final等),以及这个类父类是哪个,以及实现了哪些接口
  • 常量池:

    • 保存了字符串常量、类、接口名、字段名。主要在字节码指令中使用。
    • 在这里插入图片描述
  • 字段:

    • 当前类或接口的字段信息,包括名字,描述符,访问标识。

    • private final static int a1=0
      
    • 在这里插入图片描述

  • 方法:

    • 当前类或接口的声明的方法信息字节码指令
    • 在这里插入图片描述
  • 属性:

    • 类的属性,比如源码的名字、内部类的列表等
    • 在这里插入图片描述

2.2.3 基础信息

在这里插入图片描述

在这里插入图片描述

2.2.3.1 魔数

在这里插入图片描述

在这里插入图片描述

打开二进制的png文件,就是以89504E47开始的

在这里插入图片描述

jpg则以FFD8FF开始

在这里插入图片描述

java字节码则是以CAFEBABE开始

在这里插入图片描述

2.2.3.1 主副版本号

在这里插入图片描述

52对应jdk1.8 61则对应jdk17

2.2.4 常量池

public class HelloWorld{
    public static final String a1= "a1a1a1";
    public static final String a2= "a1a1a1";
    public static void main(String[] args){

       System.out.println("Hello world!");
    }
}

查看编译后的class文件

在这里插入图片描述

两个都是常量,且指向同一块常量值索引,CONSTANT_String_info存放着cp_info #33,依旧是个索引

在这里插入图片描述

查看cp_info #33,这时候字面量才是a1a1a1

在这里插入图片描述

为什么要两级索引呢?这是因为在jvm中的运行时数据区域中有这方法区,方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。

在这里插入图片描述

public class HelloWorld{
    public static final String a1= "abc";
    public static final String a2= "abc";
    public static final String abc= "abc";
    public static void main(String[] args){

       System.out.println("Hello world!");
    }
}

比如字段名和常量名都叫abc,但常量名是abc是String类型,而字段名是无类型的,但是都指向utf8格式的abc

在这里插入图片描述

2.2.5 方法

public static void main(String[] args){
    int i=0;
    i=i++;
    System.out.println(i);
}

对应字节码:

 0 iconst_0   			//操作数栈: [] -> [0],将常量值0压入操作数栈。
 1 istore_1   			//操作数栈: [0] -> [],将操作数栈顶的整数值(0)存入本地变量1。
 2 iload_1    			//操作数栈: [] -> [0],将本地变量1中的整数值(0)加载到操作数栈。
 3 iinc 1 by 1 			//本地变量1的值增加1。原值是0,现在变为1。
 6 istore_1				//操作数栈: [0] -> [],将操作数栈顶的整数值存入本地变量1。本地变量: [1]-> [0],
 7 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>  //获取System.out的值并压入操作数栈。
10 iload_1				//操作数栈: [Ljava/io/PrintStream;] -> [Ljava/io/PrintStream;, 0],将本地变量1中的整数值加载到操作数栈。
11 invokevirtual #3 <java/io/PrintStream.println : (I)V>
14 return

i处于局部变量表的1号位

在这里插入图片描述

如果换成++i

public static void main(String[] args){
    int i=0;
    i=++i;
    System.out.println(i);
}
 0 iconst_0
 1 istore_1				//0放到本地变量表
 2 iinc 1 by 1			//本地变量表先自增,0->1
 5 iload_1				//将本地变量1中的整数值(1)加载到操作数栈。
 6 istore_1				//操作数栈: [1] -> [],将操作数栈顶的整数值存入本地变量1。本地变量: [1]-> [1],
 7 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
10 iload_1
11 invokevirtual #3 <java/io/PrintStream.println : (I)V>
14 return

这样就不会发生i=i++这种覆盖赋值的情况了。

作业:

int i=0,j=0,k=0;
i++;
j=j+1;
k+=1;

i和k一样快,都是把0从操作数栈中放入本地变量中直接操作本地变量自增。

j最慢,从本地变量表中加载到操作数栈中,再加载1,再相加,再放入本地变量表。

2.3 linux中打开字节码文件

在这里插入图片描述

javap -v 字节码文件名称

2.4 字节码常用工具 Arthas

2.4.1 安装Arthas

在这里插入图片描述

启动arthas

在这里插入图片描述

先启动项目再分析

public class ArthasDemo {
    public static void main(String[] args) {
        while (true) {
            try {
                Thread.sleep(2000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在arthas工作目录中启动

java -Dfile.encoding=UTF-8 -jar arthas-boot.jar

-Dfile.encoding=UTF-8是让arthas以utf8格式启动,这样不会乱码
在这里插入图片描述

成功捕获到ArthasDemo,选择3回车进入arthas内部,他还自动下载了arthas3.7.2版本

3

在这里插入图片描述

2.4.2 Arthas功能

在这里插入图片描述

2.4.2.1 获取系统实时面板-dashboard

在这里插入图片描述

我们设置每隔两秒刷新一次,刷新3次

dashboard -i 2000 -n 3

在这里插入图片描述

只显示1次

在这里插入图片描述

2.4.2.2 加载特定类的字节码-dump

在这里插入图片描述

dump -d D:/File/StudyJavaFile/JavaStudy/JVM/low/day01/resource/ com.sjb.arthas.ArthasDemo

在这里插入图片描述

在这里插入图片描述

这样就获取了运行时的java文件的字节码信息

2.4.2.3 反编译已加载类的源码-jad
jad com.sjb.arthas.ArthasDemo

在这里插入图片描述

和我们的源码几乎一致

案例

在这里插入图片描述

启动springboot-classfile后

在这里插入图片描述

public UserVO user(@PathVariable("type") Integer type,@PathVariable("id") Integer id){
    //前边有一大堆逻辑,巴拉巴拉
    if(type==UserType.REGULAR.getType()){
        return new UserVO(id,"普通用户无权限查看");
    }
    return new UserVO(id,"这是尊贵的收费用户才能看的秘密!");
}

不能用==来判断类型,需要equals

在这里插入图片描述

在这里插入图片描述

即使是普通用户,但是因为用的==判断的类型,也能进入vip用户

使用jad查看

jad com.itheima.springbootclassfile.controller.UserController

在这里插入图片描述

定位到问题信息,以供以后热更新

2.4.2.4 查看JVM已加载的类信息-sc

在这里插入图片描述

sc -d 类名(java.lang.String)

查看当前类的类加载器,如果为空,则为启动类加载器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1716883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Reddit是什么?跨境独立站卖家如何用Reddit营销?

在互联网时代&#xff0c;社交媒体营销已成为品牌推广的重要手段。Reddit&#xff0c;作为一个充满活力的社区平台&#xff0c;正逐渐受到越来越多跨境独立站卖家的关注。如果你在独立站引流方面遇到瓶颈&#xff0c;不妨了解一下Reddit这个平台。本文将介绍Reddit是什么&#…

如何让物理服务器可以运行多个虚拟机:VMware ESXi系统安装-详细介绍

目录 一、虚拟机&#xff08;比如VMware ESXi上的虚拟机&#xff09;及其优势 &#xff08;一&#xff09;虚拟机 &#xff08;二&#xff09;虚拟机应用和优势 1、硬件资源利用率提升 2、灵活性和可扩展性 3、高可用性 4、简化管理 5、绿色节能 6、快速响应业务需求 …

【Unity AR开发插件】五、运行示例程序

专栏 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 链接&#xff1a; Unity开发AR系列 热更数据制作&#xff1a;制作热更数据-AR图片识别场景 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可…

SOLIDWORKS 2024:零件亮点的升级与突破

随着科技的不断发展&#xff0c;工程设计软件也在持续进步&#xff0c;以更好地满足工程师和设计师的需求。SOLIDWORKS&#xff0c;作为一款广泛使用的三维CAD软件&#xff0c;一直在不断地推出新版本&#xff0c;以提供更强大、更便捷的功能。今天&#xff0c;我们将深入探讨S…

AI绘画原理是什么?现阶段好用的AI绘画软件又有哪些呢?

AI绘画工具是一种基于人工智能技术&#xff0c;通过计算机程序自动生成艺术作品的软件。这些工具能够根据用户的输入或预设的条件&#xff0c;创作出具有艺术感的图像&#xff0c;极大地降低了绘画和设计的门槛&#xff0c;提高了创作效率和质量。 AI绘画的原理是什么呢&#…

static静态变量

概述 static是静态的意思&#xff0c;我的理解就是在一个类中创建一个变量或者方法&#xff0c;而这个变量或者方法是属于公共的可以直接通过这个类访问这个变量或者这个方法。 访问的方式 类名.static的变量名 类名.static的方法名 static变量 这里我写了一个小demo用来调…

车辆相关识别API优化您的车辆系统

车辆相关识别API是开发者们所需的重要工具&#xff0c;它们基于先进的计算机视觉和深度学习技术&#xff0c;提供了强大的车辆识别和分类能力。这些API能够从图像或视频中快速准确地识别和提取车辆的关键信息&#xff0c;如车辆型号、品牌、颜色等。对于开发者而言&#xff0c;…

在 iCloud.com 上导入、导出或打印联系人

想将iPhone上的电话本备份一份到本地电脑上&#xff0c;发现iTunes好像只是音乐播放了&#xff0c;不再支持像电话本等功能&#xff0c;也不想通过其他第三方软件&#xff0c;好在可以通过iCloud进行导入导出。下面只是对操作过程进行一个图片记录而已&#xff0c;文字说明可以…

元宇宙vr工业产品展示空间降低研发成本

元宇宙产品虚拟展厅搭建编辑器为您提供了一个自助式元宇宙场景搭建的绝佳平台。无论您是设计公司、摄影公司、营销公司还是教育机构&#xff0c;我们都能为您量身打造专属的元宇宙解决方案&#xff0c;满足您的多样化需求。 元宇宙产品虚拟展厅搭建编辑器具备强大的3D编辑功能&…

nacos 2.3.3 Windows系统安装详细版

1&#xff0c;下载 https://github.com/alibaba/nacos/releases 2&#xff0c;解压 3&#xff0c;将nacos的内置库(derby)&#xff0c;修改为我们自己的 mysql 3.1 创建一个数据库 3.2 连接数据库 3.3 执行mysql 脚本&#xff0c;在nacos的conf 目录下 mysql-schema.sql 执…

计算机图形学入门03:基本变换

变换(Transformation)可分为模型(Model)变换和视图(Viewing)变换。在3D虚拟场景中相机的移动和旋转&#xff0c;角色人物动画都需要变换&#xff0c;用来描述物体运动。将三维世界投影变换到2D屏幕上成像出来&#xff0c;也需要变换。 1.二维变换 1.1缩放变换 如上图所示&…

单片机编程的code关键字的诠释

在单片机编程中&#xff0c;code 是一个关键字&#xff0c;用于指示编译器将变量存储在程序存储器中&#xff0c;而不是在数据存储器中。通常情况下&#xff0c;程序存储器的速度比数据存储器的速度更快&#xff0c;而且程序存储器的容量较小&#xff0c;适合存储常量数据和程序…

活动会议邀请函制作易企秀源码系统 清爽的画面轻轻滑动自动翻页 带完整的前后端搭建教程

系统概述 在当今数字化时代&#xff0c;活动会议的组织和宣传变得至关重要。为了满足这一需求&#xff0c;活动会议邀请函制作易企秀源码系统应运而生。它不仅为用户提供了一个便捷、高效的工具&#xff0c;还具备一系列令人瞩目的特色功能&#xff0c;为活动会议的成功举办提…

集合—Map子类(HashMap、HashTable、Properties)

一、HashMap HashMap是Map接口使用频率最高的实现类。 HashMap是以键值对(key-value)形式存储数据。 key不能重复&#xff0c;值可以重复&#xff0c;允许使用null作为键或值。 添加相同的key&#xff0c;新的value将会覆盖原有的value。 不能保证存取顺序一样。 HashMap没有实…

探索Python编程世界:从基础到实战

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python语言简介与动态特性 代码示例&#xff1a;动态类型与变量命名 二、Python应用领…

详解布隆过滤器(含面试考点)

Bloom Filter 底层逻辑主要代码实现解析&#xff08;以C为例&#xff09;优缺点应用场景面试常问问题1&#xff1a;什么是布隆过滤器&#xff1f;问题2&#xff1a;布隆过滤器如何处理误报&#xff1f;问题3&#xff1a;如何设计布隆过滤器以最小化误报率&#xff1f;问题4&…

智能仓储物流系统(WMS)系列-货品与分类管理

好的应用系统应是细分简单&#xff0c;界面简洁易操作&#xff0c;程序代码简洁易懂的。

和隋永珍 大麗和和珠宝美学特展闪耀巴黎

2024年5月21日&#xff0c;“和隋永珍”大麗和和珠宝美学特展在巴黎优雅启幕。二零二四甲辰龙年&#xff0c;恰逢中法两国建交60周年&#xff0c;大麗和和以现代东方高级珠宝为引&#xff0c;探讨中国美学的传承与创新&#xff0c;共襄东西方文化交流之盛举。 高级珠宝品牌大麗…

设计模式21——命令模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 命令模式&#xff08;Command&…

mysql连接不上可能的原因:防火墙放行mysql的3306端口 全库复制:data目录替换即可 mysql查看版本

1.看本地localhost能否连接 2.在本地看IP能否连接 能说明本地正常 权限也够 都能的话&#xff0c;ip能否ping通 能就说明可能是防火墙原因了。关闭防火墙及杀毒试试。 我这里关防火墙就能访问了。 windows如何开启防火墙&#xff0c;又放行mysql的3306端口&#xff1f; 在 …