JVM知识体系学习一:JVM基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用

news2025/7/14 20:25:49

文章目录

  • 前言
  • 一、JVM基础
    • 1、cross platform 跨平台
    • 2、cross language 跨语言
    • 3、什么是JVM呢?一张图告诉你
    • 4、java从编码到执行*****
    • 5. 从跨平台的语言到跨语言的平台
    • 6. jvm与class文件格式
    • 7. JVM
    • 8. javac的过程
    • 9. 常见的JVM实现
    • 10. JDK JRE JVM
  • 二、Class File Format (class 文件格式)
    • 1、测试小程序
      • a、T0100_ByteCode01.java
      • b、idea打开T0100_ByteCode01.class
    • 2、class文件
    • 3、Class文件解读
      • a、javap 翻译class 文件 (java自带)
      • b、jclasslib 翻译class文件(idea插件)
        • i、一般信息
        • ii、常量池:
        • iii、接口、字段
        • iv、方法
        • v、附加属性 attributes

前言

  1. 文中所用到的class文件结构思维导图下载:class文件思维导图

一、JVM基础

1、cross platform 跨平台

即任何语言只要编译成 class 文件,在装有JVM任何的系统上 都可以运行。

在这里插入图片描述

2、cross language 跨语言

即:有好多语言是在JVM上运行的,这就是夸语言的。
在这里插入图片描述

3、什么是JVM呢?一张图告诉你

在这里插入图片描述

4、java从编码到执行*****

  1. 通过 javac 命令:将 java文件 编译成 class 文件
  2. 通过 java 命令:classloader 加载 class 文件以及 java 类库 到内存中进行装载,装载完成后, 然后调用 字节码解释器 或者JIT即时编译器 来进行解释 或者 编译。
  3. 之后 由 执行引擎 进行 执行,最终到OS操作系统。
  • 那java是解释执行的还是编译执行的呢?其实 解释和编译是可以混合的,如果代码用到的次数比较多,会把代码做成 即时编译 即做成本地的编译,就类似c语言在win中编译成exe文件,这样效率会比较高。
    在这里插入图片描述

5. 从跨平台的语言到跨语言的平台

JVM:是跨语言的平台。
java:是跨平台的语言。
在JVM上能够跑的语言 到目前有100多种,比如下图中的Scala、groovy语言等。
在这里插入图片描述

6. jvm与class文件格式

== jvm跟java无关==
在这里插入图片描述

7. JVM

  • jvm是一种规范 – java virtual machine specifications
    • https://docs.oracle.com/en/java/javase/13/
    • https://docs.oracle.com/javase/specs/index.html
  • JVM 是 虚构出来的一台计算机
    • 字节码指令集(汇编语言)
    • 内存管理:栈 堆 方法区等

白话解释:
JVM是一台虚拟出来的一台机器,也就有自己的CPU、内存管理,比如栈、堆、方法区,所以也就有后面的JVM调优等等。

8. javac的过程

在这里插入图片描述

9. 常见的JVM实现

  1. Hotspot

    • oracle官方,我们做实验用的 JVM
    • java –version
  2. Jrockit

    • BEA,曾经号称世界上最快的 JVM
    • 被Oracle收购,合并于hotspot
  3. J9 – IBM

  4. Microsoft VM

  5. TaobaoVM

    • hotspot深度定制版 ▪
  6. LiquidVM

    • 直接针对硬件 ▪
  7. azul zing

    • 最新垃圾回收的业界标杆
    • www.azul.com

在这里插入图片描述
Hotspot:就是上面所说的第一个JVM类型
mixed mode:就是 上面 1.4说的混合模式,解释和编译混合执行。

10. JDK JRE JVM

  • jdk全称:java development kit,其意思是java开发工具包。jdk是sun公司开发的,jdk包括jre(java runtime environment)java运行环境,一堆java工具[java的编译器(java c.exe),java解释执行器(java.exe)]和java基础的类库(有3000多类,常用的类150多个)。

  • JRE(Java Runtimely Environment),java运行环境,只能运行.class文件,不能编译,针对用户。JRE,包含一个JVM(java虚拟机),与java核心类库与其所支持的文件。与JDK不同,它不包含开发工具—编译器,调试器和其他工具。

  • JVM(java Virtual Machine ) ,Java虚拟机,Java运行环境。Java虚拟机,是一种虚拟出来的计算机,是通过在实际的计算机上模拟仿真各种计算机功能来实现的。

在这里插入图片描述

二、Class File Format (class 文件格式)

分析和学习class文件。目前公司面试很少用到,但是需要学习和了解哈,抱着兴趣去学。

不能抱着功利性去学。
class文件:就是编译完成之后的 .class 文件

1、测试小程序

a、T0100_ByteCode01.java

package com.mashibing.jvm.c1_bytecode;

public class T0100_ByteCode01 {
}

然后编译,生成 T0100_ByteCode01.class 文件。

b、idea打开T0100_ByteCode01.class

如果在idea中打开编译后的 T0100_ByteCode01.class 的文件,就是idea会帮我们进行反编译,反编译的多了一个默认的无参构造函数,这是默认添加的。
注释是反编译出来的注释

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.mashibing.jvm.c1_bytecode;

public class T0100_ByteCode01 {
    public T0100_ByteCode01() {
    }
}

2、class文件

  • 任何的文件都应该是010101二进制,class如果用一个16进制编辑器(sublime text 3)打开,就是如下图所示:
    在这里插入图片描述

  • class文件是 二进制字节流。

  • 数据类型:u1 u2 u4 u8 和 _info (表类型)(只是逻辑上分的,其实没有数据类型,只有0和1 )(u:Unsigned,意为为无符号的,u1指1个字节;u2指2个字节;u3指3个字节;u4指4个字节;u8指8个字节

    • _info 的来源 是Hotspot 源码中的写法
  • 查看16进制格式classFile 的工具

    • sublime(打开如上图) / notepad

    • idea插件:Bined
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      (上面的红框可以查看二进制、八进制、十六进制的文件,当然二进制是最根本的文件格式)

  • 有很多可以观察byteCode的方法

    • javap(java自带):下面有使用
    • JBE 可以直接修改
    • JclassLib idea插件之一
      在这里插入图片描述
      未下载前 是idea自带的
      将鼠标放在class文件中:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      不好观察,所以下载插件: JclassLib
      在这里插入图片描述
      在这里插入图片描述
  • classfile构成

3、Class文件解读

class就是二进制字节流,那怎么解释呢,看由谁来解释,这里是由java虚拟机 JVM 来解释的

常量池是class文件里最复杂的部分

下图就是上面2.2 第一个图片,编译后的class文件,对其进行解读。
在这里插入图片描述
== 讲解上图:==

一个小格是一个字节。对十六进制来讲,一个十六进制就是4位。两个十六进制就是一个字节 即8位。如下图可看出,第一个小格是CA,这是16进制,所以这是一个字节,即8位。

  • CAFE BABE 这是java编译后class文件的抬头,比如其他png、GIF的都有自己独有的抬头。这就是 magic number 魔法数。
  • 0000 0034 中,
    • 0000 为minor version,小版本号,比如版本是52.0,则minor version就是.0的概念
    • 0034 是major version,大版本号,十进制是52,1.8编译完后就是52,1.9就是53。
  • 1110:constant_pool_count,常量池里存在常量的个数;两个字节,216=65536,,最多可放65535个常量最多是 - 1。
  • 后面接着就是常量的表constant_pool
    其长度为constant_pool_count - 1的表;这里是10,十六进制 就是15,则 就是15-1=14个常量,为什么要减一,因为常量池数组是从1开始的(平时数组是从0开始)因为最前面保留了一个0,将来可能有一些引用指向会表示不指向任意常量的任何一项,就可以用0来代表。
  • access flags
    在这里插入图片描述

a、javap 翻译class 文件 (java自带)

这样看不是很清楚,可以通过工具来很清晰的查看,就是java自带的javap:会把class文件中的内容帮我们翻译好。(从2.2中可以看到)
javap T0100_ByteCode01.class:显示内容较少,如下,(可通过javap查看参数)
在这里插入图片描述
javap -v T0100_ByteCode01.class:下图中可以看到帮我们翻译出来的 minor version、major version、flags 等名称。
在这里插入图片描述
flags: (0x0021) ACC_PUBLIC, ACC_SUPER:后面的 ACC_SUPER 就是:该标志必须为真,JDK1.0.2之后编译出来的内容必须为真,指明invokespectial指令使用新语义

b、jclasslib 翻译class文件(idea插件)

使用 jclasslib 打开 class 文件,下面并进行分析和说明

i、一般信息

这里包含了class 文件结构的大多数基础信息,当然最重要的还是常量池。
在这里插入图片描述

  1. 本类索引,就是 this class :cp_info #7 <com/mashibing/jvm/c1_bytecode/T0100_ByteCode01>:后面的 <com/mashibing/jvm/c1_bytecode/T0100_ByteCode01> 就是本类的名称,cp_info #7 就是在常量池的7号存的。绿色可以点击,点击过去就是 常量池的7号位置。
  2. 父类索引,就是 super class:cp_info #2 <java/lang/Object> :后面的还是父类名称,前面就是父类存储在常量池的2号位置。
  3. 接口计数 即 interfaces count。
  4. 字段计数 即 fields count。
  5. 方法计数 即 methods count。
  6. 属性计数 即 attributes count。

ii、常量池:

在这里插入图片描述

  • 常量类型有很多种,如下图所示1,3,4,5,6到18,但是没有2,标记:常量池的每一种类型前边都有一个一个字节的标记,用的最多的是第一个:CONSTANT_Utf8_info ,代表 utf8的字符串。(下图的思维导图可从文章开头的前言中找到并下载
    在这里插入图片描述
    在这里插入图片描述
  • jclasslib 打开的常量池 1号位置Methodref_info 文件:存的是方法引用信息,从思维导图中可以看出存的如下图所示,包括三个 1是标记10,2是index2个字节指向其他常量池 ,3是index2个字节指向其他常量池。
    在这里插入图片描述
  • 1号位置 methodref_ref中的 类名 cp_info #2 :意思是指向类的名字在2号位置,这里又存在了4号位置。
    在这里插入图片描述
    在这里插入图片描述
  • 1号位置 methodref_ref中的 描述 cp_info #3 :指向的是3号位置的name和type。可以看出
    <init> 是构造函数
    <()v> ()是指 没有参数,V是指返回类型为void类型。
    在这里插入图片描述

iii、接口、字段

因为2.1测试小程序很简单,没有接口和字段,所以这里为空
在这里插入图片描述

iv、方法

测试小程序虽然很简单,啥都没有
但是生成一个默认的 构造函数。
这里也有最重要的code 环节,因为函数里会有code的哈,这里会有大量的指令集(JVM大约定义256个左右)
在这里插入图片描述

v、附加属性 attributes

这里默认的就是java的类名称
在这里插入图片描述

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

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

相关文章

Java多线程(二)——Thread类的相关方法

Thread类的构造方法 Thread() class MyThread extends Thread {Overridepublic void run() {System.out.println("hello Thread");} } public class ThreadDemo {public static void main(String[] args) {Thread t new MyThread();t.start();System.out.println(&…

java数据结构与算法 --- 第十章 数结构基础

第十章 树结构基础 I 引和基本概念 为什么需要树结构? 数组,查询快,增删慢 链表… 而树结构,同时提高查询和增删! 基本概念 术语: 有手就行 II 二叉树 1.概念: 二叉树:每个节点最多有两个子节点的数叫二叉树 满二叉树: 所有叶子节点都在最后一,结点的总数是2^n-1(n是层数…

jeecg-boot中上传图片到华为云obs云存储中

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 jeecg-boot框架中&#xff0c;其实对接的功能还是挺多的&#xff0c;其中就有文件云存储服务器&#xff0c;不过是阿里云oss的&#xff0c;那如果我们使用的是七牛云&#xff0c;或…

通过TortoiseGit钩子实现提交前检查作者信息是否正确

1、需求背景 从事嵌入式开发的人运行软件依赖于特定的电脑硬件&#xff0c;可能会存在多人在同一台电脑上开发的需求。 我们使用git进行软件代码版本管理&#xff0c;通过提交时的用户名和邮箱区分某次代码是哪个人提交的信息。git自身支持提交的时临时一次设置成其他的用户信…

01.OpenWrt-写在前面

01.OpenWrt-写在前面 1.1 如何学好OpenWrt OpenWrt究竟应该怎么学,这是我一直在思考的问题! 谈到OpenWrt有相关软硬件知识的人会想到路由器,路由器是OpenWrt系统最主要的使用场景.OpenWrt是基于Linux系统构建起来的,所以其他Linux系统能够做的事情OpenWrt都是可以做到. Ope…

GD32F4(10):GD32转RS422在115200下接收乱码分析

GD32F450&#xff1a;串口转RS485在115200下接收乱码 文章目录GD32F450&#xff1a;串口转RS485在115200下接收乱码1. 知识储备2. 环境3. 操作4. 插入一个知识点&#xff1a;不同MCU串口ip核实现原理4.1 首先我们来看一下STM32f的串口是怎样识别数据的4.2 GD32F4串口识别5. 我的…

毕业设计-基于机器视觉道路视频车道线检测

目录 前言 课题背景和意义 实现技术思路 摄像机校准 ​编辑 透视变换 车道像素查找 识别车道面积 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要…

电商商家必用的4大TikTok营销变现增长技巧

数据显示&#xff0c;TikTok是目前最热门的海外社交媒体平台&#xff0c;已超过多家老牌社媒平台。由于是个短视频平台&#xff0c;在当下环境里具有很强的营销推广优势&#xff0c;很多电商商家都会选择在TikTok营销产品。那电商商家必用哪些TikTok营销变现增长技巧呢&#xf…

基于决策树的智能网络安全入侵检测模型

基于决策树的智能网络安全入侵检测模型学习目标&#xff1a;学习内容&#xff1a;该论文模型下载数据集参考论文&#xff1a;综述/调查&#xff1a;申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计4077字&…

设备全生命周期管理第一股凌雄科技上市,京东、腾讯等长期看好

“设备全生命周期管理第一股”凌雄科技&#xff08;小熊U租&#xff09;于昨日正式在港交所挂牌上市。本次上市&#xff0c;凌雄科技的IPO发行价为7.60港元/股&#xff0c;募集资金净额约为3.372亿港元&#xff0c;上市时的总市值达到26.85亿港元。 特别说明的是&#xff0c;凌…

适用更多会议场景,华为云会议的分组讨论功能来了!

适用更多会议场景&#xff0c;华为云会议的分组讨论功能来了&#xff01; 如今&#xff0c;线上沟通成为常态&#xff0c;线上会议更是成为工作推进过程中不可缺少的环节。但在一些场景中&#xff0c;例如在跨部门协调&#xff0c;沙龙研讨&#xff0c;教育培训或者招聘面试时&…

索引生命周期管理ILM看完不懂你锤我

阅读完本文你可以学到什么是索引生命周期管理&#xff0c;各个阶段可以做的操作以及如何使用索引模版使用索引生命周期策略&#xff0c;下面就跟我一起来吧 基础理论篇 索引生命周期管理&#xff08;ILM&#xff09;是一种可以让我们随着时间推移自动化的管理索引的一种方式。…

SpringBoot SpringBoot 原理篇 1 自动配置 1.1 bean 的加载方式【一】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.1 bean 的加载方式【一】1.1.1 环境准备1.1.2 第一种方式1.1.3 第…

Go-Excelize API源码阅读(三十四)——RemoveRow

Go-Excelize API源码阅读&#xff08;三十四&#xff09;——RemoveRow 开源摘星计划&#xff08;WeOpen Star&#xff09; 是由腾源会 2022 年推出的全新项目&#xff0c;旨在为开源人提供成长激励&#xff0c;为开源项目提供成长支持&#xff0c;助力开发者更好地了解开源&a…

OpenGL原理与实践——核心模式(五):颜色、基础光照、Phong模型、材质与光

目录 颜色相关理论 什么是颜色 如何计算颜色&#xff1f; 简单实现 Phong光照模型——局部光照模型 环境光 ​编辑 漫反射 镜面反射 材质与光 材质与纹理的关系 材质在shader的体现 材质属性与光属性 光在shader的体现 整体源码实现及渲染结果 关键代码 shade…

软件测试员如何在恶劣的内卷环境下脱颖而出?

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 我一个很要好的朋友&#xff0c;现在就读大三&#xff0c;像很多大学生一样面临着能否顺利毕业的压力和考证的焦虑&#xff0c;看着寝室四个人每天都在玩&…

Vue--》混合文件使用以及ref的引用讲解

目录 mixin混合 前言 ref的引用DOM ref引用组件 mixin混合 在日常开发中&#xff0c;当我们开发的各种组件可能会有相同的内容&#xff0c;我们可以将相同的内容在各个相对应的组件内删除&#xff0c;然后放在同一个配置里。所谓混合&#xff1a;两个或多个组件共享一个配…

数据挖掘,在商业智能BI领域的运用

数据挖掘在商业领域&#xff0c;特别是在零售业的运用是比较成功的。由于各业务系统的普遍使用&#xff0c;再加上商业智能BI的可视化分析&#xff0c;企业可以收集到大量关于购买情况的数据&#xff0c;并且数据量在不断激增。利用数据挖掘技术可以为经营管理人员提供正确的决…

Java 集合

目录 一、概念 二、接口 2.1、 集合接口 2.2、 Set 接口 2.2.1 zise方法 2.2.2 isEmpty 方法 2.2.3 contains 方法 2.2.4 Iterator 方法 2.2.5 toArray 方法 2.2.6 add 方法 2.2.7 remove 方法 2.2.8 containsAll 方法 2.2.9 containsAll 方法 2.2.10 ret…

数据仓库基础

文章目录1 数据仓库1.1 数据仓库为何而来1.2 数据仓库主要特征1.2.1 面向主题1.2.2 集成性1.2.3 非易失性1.2.4 时变性1.3 数据仓库、数据库、数据集市1.3.1 OLTP1.3.2 OLAP1.3.3 OLTP和OLAP的对比1.3.4 数据库和数据仓库的区别1.3.5 数据仓库和数据集市的区别1.4 数据仓库分层…