JVM修炼之路【2】-正确的认识 字节码文件

上一篇中认识了JVM的基本组成,我们说JVM只认识字节码文件。那么在字节码文件进入JVM之前,我们先认识了解字节码文件长什么样,我们作为工程师不需要去死扣底层的理论知识,但是我们只是需要正确的打开字节码文件 知道里面有哪些部分组成,正确的认识和识别这些部分


下载jclasslib

https://github.com/ingokegel/jclasslib/releases/tag/6.0.4
用这个工具打开.class文件

在这里插入图片描述

字节码文件组成

字节码文件的组成部分,它将我们的java代码文件中的内容编译后进行分类。
这一段内容 看似很复杂 其实很好理解,

对我们java程序员来说 我们代码中的每一个类, 里面有类名 有公有私有标志 有我们定义的各自方法 接口 类, 各自常量 变量 静态变量
这些我们天天见 天天用的东西,当我们的一个java类文件 编译成 字节码文件的时候 虽然里面的格式变了 但是内容还是这些内容,
字节码文件就是把这些内容 存储起来

在这里插入图片描述

基础信息

我们可以通过上面这个工具来查看字节码文件中基础信息的内容,
比如
魔数
(一个文件的头几个字节,通过这些内容 判断这文件的文件类型 版本等,不如你把一个乱七八糟的文件格式让虚拟机去加载 那么虚拟机一检测就知道文件格式不对,再比如 你把jdk8版本的文件 扔给jdk6虚拟机去执行 这里还没进jvm内存 就给你查出来了 设计非常之严谨)

父类是什么(继承了哪个类)/接口

解决我们在代码中遇到的相关问题, 比如


在这里插入图片描述
像这种某个类文件版本错误,我们可以查一下它的主版本号 就知道是版本不兼容。


常量池

在这里插入图片描述
常量池的最大意义是避免重复的值 节省空间,在我们的代码中的常量 值也好 或者 字段的名称 方法的名称, 只要是重复的名称 在常量池中只会存一份:
比如 StringBuilder 它可以是类名 也可以是一个字符串叫 ”StringBuilder“

在常量池中它回这样存:
在这里插入图片描述
它的引用id 是40 ,意味着多个地方要用就直接引用#40

这样最大的好处就是节省空间。


字段

类文件的字段(表)部分,用于描述接口或者类中声明的变量。比如字段的作用域(public private protected)是否static 是否final 是否并发可见性(volatile)等等

方法

方法表中存放 描述方法的内容 描述方式与字段非常相似,比如方法 作用域(public private protected)是否static 是否final

属性

类的属性 比如源码的文件名,内部类的列表等等

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值