当前位置: 首页 > news >正文

【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拼起来存储的

字段描述符解释表

在这里插入图片描述

类访问和属性修饰符标志

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue条件判断:v-if、v-else、v-else-if、v-show 指令
  • MySQL 升级:MySQL Server 变更详解 (8.0.36 ~ 8.0.37)
  • Fiddler不仅可以抓包,还可以做接口测试喔
  • 【ACM出版,高录用EI快检索】第七届计算机信息科学与人工智能国际学术会议(CISAI 2024,9月6-8)
  • 硬布线控制器的设计
  • MinerU pdf文档解析markdown格式、内容提取
  • 【Qt笔记】Qt建立UDP通信
  • 面试题:Rabbitmq怎么保证消息的可靠性?
  • 电脑桌面管理如何做?2024电脑桌面终极管理方法分享
  • 【安全靶场】-DC-5
  • 『基础』OS-1计算机系统概述_操作系统发展历程及它的运行环境
  • 机器人蓝牙通信绕坑
  • 【pip镜像设置】pip使用清华镜像源安装
  • <数据集>无人机航拍不同高度牧羊识别数据集<目标检测>
  • day06_算法训练
  • [NodeJS] 关于Buffer
  • CSS 提示工具(Tooltip)
  • docker python 配置
  • hadoop集群管理系统搭建规划说明
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • JS专题之继承
  • mysql_config not found
  • mysql常用命令汇总
  • text-decoration与color属性
  • WebSocket使用
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 我是如何设计 Upload 上传组件的
  • 走向全栈之MongoDB的使用
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #Z0458. 树的中心2
  • %check_box% in rails :coditions={:has_many , :through}
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计ssm电影分享网站
  • (南京观海微电子)——示波器使用介绍
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)Google的Objective-C编码规范
  • (转)Mysql的优化设置
  • (转)Unity3DUnity3D在android下调试
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***监测系统的构建(chkrootkit )
  • .NET 设计模式初探
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET分布式缓存Memcached从入门到实战
  • .py文件应该怎样打开?
  • /etc/sudoer文件配置简析
  • ?php echo ?,?php echo Hello world!;?
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解