【JVM】JVM解析字节码文件过程(一)

JVM解析字节码文件过程

不同语言能在JVM上运行的本质

IDEA中如何查看字节码解析,安装binnary hex插件

大端与小端模式

大端模式:高位存在低地址,低位存高地址

小段模式:与大端模式相反

字节码文件组成

不同的JDK版本号所对应的major和minor版本号

常量池项

String变量的最大长度为多少?

String变量在常量池中表示的结构是Constant_String_info结构,其中它的index指向了字符串字面量的索引,而字符串字面量的表示结构为Constant_Utf8_info,其中length字段表示UTF-8编码的字符串的长度,由两个字节组成表示的最大长度为2^16 -1 = 65535,但是Java虚拟机还需要1个字节的指令作为结束,所以其实真正的有效范围是65534,记住这是编译器的限制,运行期还是受制于int类型

为什么Java虚拟机还需要1个字节的指令作为结束?程序异常处理的有限范围解释

start_pc和end_pc两项的值表明了异常处理器在code[]数组中的有效范围。start_pc必须是对当前code[]数组中的某一指令的操作码的有效索引,end_pc要么是对当前code[]数组中某一指令的操作码的有效索引,要么等于code_length的值,即当前code数组的长度。start_pc的值必须比end_pc小。当程序计数器范围[start_pc,end_pc)内时,,异常处理器就将生效。即设x为异常句柄的有效范围内的值,x满足:start_pc<=x<end_pc.

实际上,end_pc值本身不属于异常处理器的有效范围,这点属于Java虚拟机历史上的一个设计缺陷:如果Java虚拟机中的一个方法的code属性的长度刚好是65535个字节,并且以一个字节长度的指令结束,那么这条指令将不能被异常处理器所处理。不过编译器可以通过限制任何方法、实例初始化方法或类初始化方法的code[]数组最大长度为65534,这样可以间接弥补这个BUG

Constsant_Uff8_info中为什么要存储字符串长度?

C++中因为存储了字符串的'\0',但是Java没有把这个\0编译进字节码文件中,C++要根据这个\0字符可以判断一个字符串的结束,java则是通过String的长度来判断一个字符串的结束

常量池中的0号索引是this指针,具体是什么想法不得而知。

常量池其实只有三种数据结构类型,String比较特殊,还有就是4字节类型和8字节类型。如Field_info类型,它的结构如下:

class index:22

nameAndType index:33

用一个short来存储 2个字节 :0xffff

22 << 16 0x2200

0x2200 | 0x33

4个字节合起来就是0x00220033拼起来存储的

字段描述符解释表

类访问和属性修饰符标志

表示方法访问权限及属性的各标志

相关推荐
sjsjsbbsbsn5 分钟前
Spring Boot定时任务原理
java·spring boot·后端
yqcoder6 分钟前
Express + MongoDB 实现在筛选时间段中用户名的模糊查询
java·前端·javascript
菜鸟蹦迪34 分钟前
八股文实战之JUC:ArrayList不安全性
java
2501_9032386534 分钟前
Spring MVC配置与自定义的深度解析
java·spring·mvc·个人开发
逻各斯1 小时前
redis中的Lua脚本,redis的事务机制
java·redis·lua
计算机毕设指导61 小时前
基于Springboot学生宿舍水电信息管理系统【附源码】
java·spring boot·后端·mysql·spring·tomcat·maven
计算机-秋大田1 小时前
基于Spring Boot的兴顺物流管理系统设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·spring·课程设计
计算机小白一个1 小时前
蓝桥杯 Java B 组之背包问题、最长递增子序列(LIS)
java·数据结构·蓝桥杯
二十雨辰2 小时前
[Java基础]网络编程
java·开发语言
ACGkaka_2 小时前
抓包工具(三)Wireshark代理抓包Java程序的HTTPS请求
java·https·wireshark