博客结构

  • 0.前言:你所不知道JVM的野心
  • 1.为什么要学习字节码文件
  • 2.字节码文件的本质
  • 3.字节码文件的结构
  • 4.日常代码的启示


0.前言:你所不知道JVM的野心

小时候天真的以为JVM就是专门为Java语言先天研发的,还是too young to simple,JVM的野心远远不止于此。在此,纠正几个概念:
(1).字节码文件:JVM支持运行的二进制格式文件
由此可知,只要是编译成字节码文件的预研,JVM统统的运行。这样其实就不仅仅达到了一次编译,处处运行的跨平台功能,更是达到的跨语言的能力。
(2).JVM:具有跨平台、跨语言能力
(3).支持编译成字节码文件的语言:
Groovy,JRuby,Jython。。。。。。
支持的语言如下文:

此处补图:操作系统/CPU指令集 —JVM — 高级语言 -----汇编语言的关系

1.为什么要学习字节码文件

(1)拓展视野,从生活角度来解释(这个解释是看别人的解释,如有雷同,纯属巧合)
例子:
如果你是一个非计算机专业的学生,你老是给你几张图书的拍照,大概3000字,让你打印成文字。你打开电脑,噼里啪啦一顿敲,搞了一下午干完了。如果你知道语音输入,那么你可能采用语音输入的方式,30分钟搞定。如果你了解 OCR 图片文字识别,可能 5 分钟搞定。不同的方法,带来的效果完全不同。然而最可怕的是,你不会语音输入或者OCR你不会觉得自己少了啥。OCR识别绝对不是你提高点打字速度可以追赶上的。关键你要知道有OCR和语音输入。
(2).要了解JVM的原理,字节码是JVM识别执行的文件,所以,学习字节码文件就显得尤为重要
(3).比如通过字节码的学习你可以更好地理解 Java中各种语法和语法糖背后的原理,更好地理解多态等语言特性
有个哥们思考的挺深刻,如下:

此处补图字节码原理来解释Java语言:
(a)局部变量优化全局变量调用的原理
(b)Java中的多态

2.字节码文件的本质

本质就是一个二进制的JVM可识别文件。将相关高级语言编译成字节码文件,各数据项目按照一定顺序紧凑地排列在Class文件中,中间没有添加任何分割符。

3.字节码文件的结构

0.使用WinHex打开字节码文件如下图

android 字节码编辑 字节码文件是什么意思_JVM

1.只有两种数据类型:
(1)无符号数:属于基本数据类型。描述数字、索引引用、数量值、字符串值。
(2)表:多个无符号数组成

2.字节码文件的16个数据项组成(类型分为以下十类)

字节码十类结构:

android 字节码编辑 字节码文件是什么意思_字节码_02


字节码十六种数据类型:

android 字节码编辑 字节码文件是什么意思_java字节码_03


(1)magic:(u4)魔数 表示文件的类型(图片jpg、png也是如此)

(2)minor version (u2) 次版本数 45.6780 6780即为次版本数

(3)major version (u2)主版本数 45为主版本数 他们的作用是表明编译的JDK版本,要求JVM的版本不能低于该版本。高版本JVM可以兼容低版本字节码文件,但是,低版本JVM无法兼容高版本字节码文件。

(4)constant_pool_count 常量数目

(5)cp_info constant_pool 常量池

4.日常代码的启示

1.尽量避免朝生夕灭的短命大对象:否则经常触发GC