java基础--JVM的学习1--jvm基础和class文件的组成

文章目录

  • JVM概念
    • JVM功能
  • JVM组成
  • class文件
      • 一般信息
    • 常量池
    • 字段
    • 方法
  • 反编译

使用到了idea的jclasslib插件

JVM概念

全称Java Virtual Machine,java虚拟机。
将java字节码文件正确的加载和允许。

JVM功能

  • 解释运行
    对字节码指令实时的解释成机器码,让计算机执行。
    所以性能会比c和c++比较低。
    不过也实现了跨平台,一套代码,生成相同的机器码,通过不同的平台的jvm,来进行解释成对应机器的机器码。

  • 内存管理
    自动的为对象和方法进行分配内存,自动的垃圾回收机制,回收不需要的对象。

  • 即使编译
    对热点代码进行优化,提高执行效率。
    相当于在业务中加了缓存,下次执行的时候直接去内存中找机器码。

JVM组成

  • 类加载器
    将类的class文件加载到内存
  • 运行时数据区(jvm内存管理)
    管理jvm使用到的内存,比如创建对象和销毁对象。
  • 执行引擎
    执行代码,将指令解释成机器码并运行
  • 本地接口
    调用本地jvm/操作系统的接口,native修饰的方法,由虚拟机c/c++实现的

class文件

  • 一般信息
    记录了class文件的魔术,基本信息,如主次版本号,各种计数,本类和父类索引,访问标志等
  • 常量池
    避免相同的内容重复定义。在常量池中保存了字符串常量、类和接口名、字段名
  • 字段
    类或接口声明的属性信息
  • 方法
    类和接口声明的方法名称描述和访问表示
  • 属性
    类的属性,源码文件名,内部类的列表
    在这里插入图片描述

一般信息

  • 魔数
    字节码文件都是以cafebabe 的魔数开头,用于标志此文件类型为class文件。(所以的文件都是以该标志进行区别,后缀是方便人来查看)

  • 主次版本号:
    标识jdk的版本号,主版本号是jdk的大版本,次版本用于区分不同的大版本的小版本。
    大版本的计算方式:1.2以后,主版本号-44等于jdk的版本。jdk1.0-1.1使用45.0-45.3,jdk1.2是46.
    上图61,所以jdk是61-44=17
    运行的时候不能兼容大版本,存在最小兼容的版本号。

  • 计数
    对各种属性进行统计。

  • 访问标识

  • 本类,父类索引
    记录本类,父类的全限定类名的字符串字面量在常量池中的索引

常量池

避免相同的内容重复定义。在常量池中保存了字符串常量、类和接口名、字段名。

  • 方法的名称和所在类以及方法的修饰符的记录地址
    在这里插入图片描述

  • 类名的记录地址
    跳转到8
    在这里插入图片描述

  • 字符串常量
    这里是上面类名指定的索引的字符串常量,包括字符数字的长度和字符串长度,字面量
    跳转到10记录了字符串的具体值
    在这里插入图片描述

  • 名称和描述
    记录对应的名称和一些其他信息如方法的名称就是方法名,描述就是形参值和返回值
    跳转到18可以看到器名称的索引和描述的索引。
    在这里插入图片描述

  • 其他
    这里就不一一列举了,很多是可以看名称就知道意思的
    在这里插入图片描述

注意点:
字符串和字面量不是一个意思,字符串是string_info存储的是字面量的地址,而字面量是ut8_info。
字符串有字符串常量池,保存的就是string_info

为什么不和在一起?字符串不就是字面量?
这2者是不一样的,通过上面我们知道,类名、方法名、描述都说用字面量存储的,为了复用/解耦,string和字面量不能划等号,不是所有的字面量都要去字符串常量池。如果用字面量等价于字符串,那么字符串常量池会保存多少复用不到的值。

字段

字段记录者类的变量的名称、描述符和访问表示
在这里插入图片描述
在这里插入图片描述

为什么静态tag和name以及s表示有区别?
这个是因为类的加载上有所不同,这个在类加载的时候详解。这里粗说一下,name的值不会记录在class文件中而是在创建对象的时候赋值,而其他tag和s都会在class文件中保留其值
在这里插入图片描述

方法

记录属性
在这里插入图片描述

记录方法的字节码指令
在这里插入图片描述

  • LineNumberTable
    可指明某条指令对应于源码哪一行
  • LocalVariableTable
    在方法执行过程中存放所有局部变量。确定局部变量的范围。
    起始pc,起始的范围,第二个是长度生效的范围。序号,是存储值的起始位置
    在这里插入图片描述
    下面记录了局部变量的最大槽数,超出范围的变量占用的槽会被复用。
    在这里插入图片描述
    可以看到有复用

我开始的时候是没有看见j、l的变量在局部变量表中的什么位置的,应该是未使用优化掉了,我加上打印的时候就有了。

在这里插入图片描述

  • stackMapTable
    记录了一个方法中操作数栈与局部变量区的类型在一些特定位置的状态

反编译

javap
jdk自带了反编译工具javap,可以查看字节码的信息

javap的用法格式:

javap <options> <classes>

其中classes就是你要反编译的class文件。 在命令行中直接输入javap或javap -help可以看到javap的options有如下选项:

-help  --help  -?        输出此用法消息
 -version                 版本信息,其实是当前javap所在jdk的版本信息,不是class在哪个jdk下生成的。
 -v  -verbose             输出附加信息(包括行号、本地变量表,反汇编等详细信息)
 -l                         输出行号和本地变量表
 -public                    仅显示公共类和成员
 -protected               显示受保护的/公共类和成员
 -package                 显示程序包/受保护的/公共类 和成员 (默认)
 -p  -private             显示所有类和成员
 -c                       对代码进行反汇编
 -s                       输出内部类型签名
 -sysinfo                 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)
 -constants               显示静态最终常量
 -classpath <path>        指定查找用户类文件的位置
 -bootclasspath <path>    覆盖引导类文件的位置
一般常用的是-v -l -c三个选项:

javap -v classxx,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。
javap -l 会输出行号和本地变量表信息。
javap -c 会对当前class字节码进行反编译生成汇编代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/157854.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数字人】7、GeneFace++ | 使用声音和面部运动系数的关系作为 condition 来指导 NeRF 重建说话头

文章目录 一、背景二、相关工作2.1 唇形同步的 audio-to-motion2.2 真实人像渲染 三、方法3.1 对 GeneFace 的继承3.2 GeneFace 的结构3.2.1 Pitch-Aware Audio-to-Motion Transform3.2.2 Landmark Locally Linear Embedding3.2.3 Instant Motion-to-Video Rendering 四、效果 …

学人工智能等于失业?

随着科技的快速发展&#xff0c;人工智能已经渗透到我们生活的方方面面&#xff0c;从手机、智能家居到自动驾驶汽车&#xff0c;都离不开人工智能技术的支持。 因此&#xff0c;学习人工智能已经成为越来越多人追求高薪职业的选择。在这篇文章中&#xff0c;我们将探讨学习人…

Linux基本指令及周边(第一弹)

文章目录 前言mkdir指令&#xff08;重要&#xff09;&#xff1a;tree指令rmdir指令 && rm 指令(重要&#xff09;&#xff1a;touch指令ls指令pwd指令cd 指令用户家目录man指令&#xff08;重要&#xff09;&#xff1a;mv指令&#xff08;重要&#xff09;cat指令绝…

Linux 系统误将 chmod 权限改成 了 000,如何恢复?

Linux 系统误将 chmod 权限改成 了 000&#xff0c;如何恢复? busybox 是 Linux 标配&#xff0c;含有大多数主流 Linux 命令&#xff0c;你可以把它的存在当作救急备份。简单功能都可以调用 busybox 完成。这也就意味着很多原始命令出故障的情况下都可以用 busybox 暂时替代。…

调用本地大模型实现聊天机器人ChatBot

AWS Instance本地部署大模型 AWS上申请带GPU的instance&#xff0c;例如g4dn系列&#xff0c;申请instance后安装CUDA的driver&#xff0c;driver安装完成后&#xff0c;就可以在带gpu的instance上部署开源的大模型了。如果想了解在aws上部署本地模型细节&#xff0c;可以阅读…

upload-labs关卡11(双写后缀名绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十一关通关思路1、看源代码2、bp抓包双写后缀名绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的…

主键问题以及分布式 id

分布式 id 需要处理的问题主要是同一时间在多台机器中保证生成的 id 唯一&#xff0c;为了这么做我们可以这么做&#xff1a; 分布式 id 生成策略 先说几个已经被淘汰的策略引出分布式 id 的问题 1&#xff0c;UUID&#xff1a;UUID 随机并且唯一&#xff0c;在单一的数据库…

JS进阶——构造函数数据常用函数

1、深入对象 1.1 创建对象三种方式 1.1.1 利用对象字面量创建对象 1.1.2 利用new Object创建对象 1.1.3 利用构造函数创建对象 1.2 构造函数 构造函数&#xff1a;是一种特殊的函数&#xff0c;主要用来初始化对象 使用场景&#xff1a;常规的{...}语法允许创建一个对象。…

【数据结构】手撕双向链表

目录 前言 1. 双向链表 带头双向循环链表的结构 2. 链表的实现 2.1 初始化 2.2 尾插 2.3 尾删 2.4 头插 2.5 头删 2.6 在pos位置之前插入 2.7 删除pos位置 3.双向链表完整源码 List.h List.c 前言 在上一期中我们介绍了单链表&#xff0c;也做了一些练习题&…

IC设计企业,如何安全、可控、高效的传输设计文档和研发数据?

近年来&#xff0c;半导体的应用领域不断拓展&#xff0c;在全球经济和社会发展中的重要性与日俱增&#xff0c;半导体芯片是数字经济的核心&#xff0c;承载着现代产业发展&#xff0c;具有举足轻重的价值。从半导体行业的角度&#xff0c;IC设计是关键的一环&#xff0c;我国…

中科创达:坚定看好未来十五年的大模型机遇

中科创达是一家成立于2008年的智能操作系统产品和技术提供商&#xff0c;15年前公司成立的时候正赶上了安卓操作系统将功能手机推向了智能手机&#xff0c;截至目前&#xff0c;已赋能超过近9亿台手机走向市场。2014年中科创达开始拓展智能汽车方向&#xff0c;2015年拓展物联网…

CSGO的那些事儿:CS2这么差,为什么不改回CS1?

揭秘csgo饰品涨价背后的残酷真相 1、V社现在更新内容集中在游戏性的修复方面。 所以原来期望的新地图新大行动等&#xff0c;要等到游戏本体趋于稳定后才更新。但是&#xff0c;因为距离下一个大型活动&#xff0c;也就是丹麦major还有5个月时间&#xff0c;那这之间必然要有一…

kubernetes 高可用集群

目录 一、haproxy负载均衡 二、pacemaker高可用 三、部署control-plane 四、部署worker node 实验环境 主机名 IP 角色 docker 192.168.67.10 harbor k8s1 192.168.67.11 control-plane k8s2 192.168.67.12 control-plane k8s3 192.168.67.13 control-plane k8s…

opencv(5): 滤波器

滤波的作用&#xff1a;一幅图像通过滤波器得到另一幅图像&#xff1b;其中滤波器又称为卷积核&#xff0c;滤波的过程称为卷积。 锐化&#xff1a;边缘变清晰 低通滤波&#xff08;Low-pass Filtering&#xff09;&#xff1a; 目标&#xff1a;去除图像中的高频成分&#…

【打卡】牛客网:BM55 没有重复项数字的全排列

自己写的&#xff1a; 虽然题目要求了排序&#xff0c;但是我没排序也可以通过。 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param num int整型vector * return int整型vector<vec…

23届计科,想找Java开发之类,真的是很难吗?

23届计科&#xff0c;想找Java开发之类&#xff0c;真的是很难吗&#xff1f; 你的投递信息(投递多少家&#xff0c;如何跟hr打招呼&#xff0c;已读不回如何应对等)都亮- -下才能知道问题出在 哪。最近很多小伙伴找我&#xff0c;说想要一些Java的资料&#xff0c;然后我根据…

Ubuntu 下C++数字雨

以前写过一个Window下的数字雨&#xff0c;像黑客帝国里那样的01数字&#xff0c;现在补充一版Linux下的。使用了curses库&#xff0c;安装方法与使用方法参照 Linux下curses函数库的详细介绍_libcurses库-CSDN博客 5-linux学习笔记之-----curses-CSDN博客 效果如下&#xf…

21. 深度学习 - 拓朴排序的原理和实现

文章目录 Hi,你好。我是茶桁。 上节课&#xff0c;我们讲了多层神经网络的原理&#xff0c;并且明白了&#xff0c;数据量是层级无法超过3层的主要原因。 然后我们用一张图来解释了整个链式求导的过程&#xff1a; 那么&#xff0c;我们如何将这张图里的节点关系来获得它的求…

抖音自动评论脚本,可按关键词,实现批量点赞,按键精灵开源版!

这个脚本是我之前给一个客户开发的&#xff0c;现在用着也没啥意义&#xff0c;开发了很多&#xff0c;我索性就把代码直接分享出来&#xff0c;给一些新手做学习研究用&#xff0c;里面很多结构都是自己花费了很大的心思和心血才弄出来的&#xff0c;所以价值很高。 UI界面&a…

OpenAI GPT5计划泄露

OpenAI的首席执行官萨姆奥特曼在最近接受《金融时报》的专访时&#xff0c;分享了OpenAI未来发展的一些新动向。此外&#xff0c;他还透露了关于即将到来的GPT-5模型以及公司对AGI的长期目标的一些细节。 奥特曼指出&#xff1a; 1.OpenAI正在开发GPT-5&#xff0c;一种更先进的…