一流程序员与二流程序员的分水岭:JVM虚拟机-全面理解

萨瓦迪卡2周前 (09-22)jvm84

秉承一个信念,要学遍学底层逻辑。那是一通百通的底气。

一、学不学JVM 是自主解决问题的一流程序员与跟着别人做CRUD的二流程序员的分水岭。只有深入了解透彻jvm的工作过程及原理,才能对自己开发出高性能的代码充满信心。

二、JVM虚拟机的本质将class文件转换成操作系统具体的指令。
一个java文件从编写到执行的过程:通过javac将java文件编译成一个class文件交给虚拟机,虚拟机的工作过程如图:


d486157c-7b0e-44f5-a572-119c6318f819.png

1首先就是将classFile文件通过类加载(ClassLoader也就是个类)加载到jvm虚拟机的内存中。就是将类加载到就是方法区(元数据区)

2然后交给执行引擎,将类中指令解析出来执行,执行过程中会将类创建对象。

3再将对象创建到堆当中。

那要执行某个东西需要一个逻辑就是线程。因为只有线程是执行程序的唯一单元。在jvm内部,会对每一个线程分配一个虚拟机栈(左数第2列),它是一个先进后出的栈结构。在这个栈里面会记录当前线程运行的所需要的数据。


虚拟机栈(线程私有)核心包括:
 栈帧(会为每个方法创建一个专属的内存空间 ),栈帧又包含:
局部变量表:存放每个方法里的局部变量
操作数栈:这两个是执行java文件最基础的数据结构,记录我要执行这个方法需要多少的内存。局部变量对应的操作数。
动态链接库:是指向方法区的哪个方法
返回地址(方法出口):执行完返回到哪里
附加信息:jvm自己实现时附带的信息。
程序计数器:记录当前线程运行到哪一步了。

二、Class 文件规范

1、Class文件结构

实际上,我们需要了解的是,Java 官方实际上只定义了JVM的一种执行规范,也就是class文件的组织规范。理论上,只要你能够写出一个符合标准的class文件,就可以丢到 JVM 中执行。至于这个class文件是怎么来的,JVM 虚拟机是不管的。这也是 JVM 支持多语言的基础。
这个规范到底是什么样子呢?当然,你可以直接去看 Oracle 的官方文档。JDK8 的文档地址:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 。后面也会有文章详细分析每一个字节。这里,我们只抽取主体内容。
比如,对于一个ByteCodeInterView.class文件,可以用 UltraEdit 工具打开一个class文件,看到的内容部分是这样的:

6d7ad69d-9884-463a-b89d-84fd381a0b6b.png

中间这一部分就是他的二进制内容。当然这是十六进制的表达。空格隔开的部分代表了 8 个bit,而每一位代表的是 4 个 bit字节,也就是一个十六进制的数字。例如 第一个字母 C 就表示十六进制的 12二进制是 1100。而所有的class文件,都必须以十六进制的 CAFEBABE 开头,这就是 JVM 规范的一部分。这也解释了 Java 这个词的由来,到底是一种咖啡,还是爪哇岛。

Spring6及springboot3已经用到jdk17了,但是我们jdk8 是跑不起来spring6的。

后面的部分就比较复杂了,没法直接看。可以用 javap指令可以直接来看一些class文件。比如:

b1b8939c-e33d-4fe1-aaa0-bc7815e81692.png

还是不容易查看或看懂,可以安装并使用插件:jclasslib Bytecode viewer图形化查看:

950429fd-f774-4ab9-aef7-bbe18e9a6f19.png

可以看到jvm的字节码,以及整个的执行过程:

6397a883-696f-494c-a12b-fdfa96d48ccc.png6397a883-696f-494c-a12b-fdfa96d48ccc.pngd9003aee-6ee3-4f2b-93ce-6231b23bbbe0.png

再就是LineNumbertable这里,说明第10行代码执行的 0到6的指令。

image.png

本文原创,转载必追究版权。

分享给朋友:

相关文章

java将金额转化为大写金额

 private static String[] num = {"零","壹","贰","叁","肆...

freeMarker 截取字符串(操作字符串函数 )

<#if c.proSummary!?length gt 25>  <!-- 如果长度 >25 截取25个字-->    ...

MyEclipse10.7注册码生成

注意经验里的工具可能不可用,请点击 生成注册码工具  下载。提取码:p1w4MyEclipse10.7注册码激活步骤:点击下面的链接http://jingyan.baidu.com/arti...

js/jquery 实现点击图片更换头像(图片)实例

    总之一句话, 可以先将 file类型 的input 隐藏 起来,通过 图片(头像)的onclick事件 来触发 file 的onclick事件。1.引入外部js:...

jquery 操作html元素(及CSS)

jquery 操作html元素(及CSS)

 $("li").addClass("aui-user-view-cell aui-img") ;  //给元素添加样式$('#a1...

竟然可以这样打扮!女人呆了!男人痴了!

来个轻松点的哇,惊呆了,肯定贵不了,立刻去瞅瞅...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。