一篇深入理解字节码文件

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

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

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

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

2.字节码文件的本质

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

3.字节码文件的结构

0.使用WinHex打开字节码文件如下图
在这里插入图片描述

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

2.字节码文件的16个数据项组成(类型分为以下十类)
字节码十类结构:
在这里插入图片描述
字节码十六种数据类型:
在这里插入图片描述
(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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值