JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。
如上面的架构图所示,JVM分为三个主要子系统:
Java的动态类加载功能由ClassLoader子系统处理。它加载,链接。并在运行时(而非编译时)首次引用类似初始化类文件。
加载
类将由此组件加载。BootStrap ClassLoader,扩展ClassLoader和Application ClassLoader是有助于实现该目标的三个ClassLoader。
连结
初始化
这是ClassLoading的最后阶段;在此,所有静态变量将被分配原始值,并且将执行静态块。
运行时数据区分为五个主要部分:
1、方法区域 :所有类级别的数据(包括静态变量)都将存储在此处。每个JVM只有一个方法区域,它是共享资源。
2、堆区 :所有对象及其对应的实例变量和数组将存储在此处。每个JVM还有一个堆区。由于“方法”和“堆”区域共享多个线程的内存,因此存储的数据不是线程安全的。
3、堆栈区 :对于每个线程,将创建一个单独的运行时堆栈。对于每个方法调用,将在堆栈存储器中创建一个条目,称为堆栈帧。所有局部变量都将在堆栈存储器中创建。堆栈区域不是共享资源,因此是线程安全的。堆栈框架分为三个子实体:
4、PC寄存器 :每个线程将具有单独的PC寄存器,以在执行指令后保存当前执行指令的地址,PC寄存器将用下一条指令进行更新。
5、本机方法堆栈 :本机方法堆栈保存本机方法信息。对于每个线程,将创建一个单独的本机方法堆栈。
分配给运行时数据区的字节码将由执行引擎执行。执行引擎读取字节码并逐段执行。
1、解释器:解释器解释字节码的速度较快,但执行速度较慢。解释器的缺点是,当多次调用一种方法时,每次都需要新的解释。
2、JIT编译器:JIT编译器消除了解释器的缺点。执行引擎将使用解释器的帮助来转换字节码,但是当发现重复的代码时,它将使用JIT编译器,该编译器将编译整个字节码并将其更改为本地代码。此本地代码将直接用于重复的方法调用,从而提高系统的性能。
3、垃圾收集器:收集并删除未引用的对象。垃圾回收可以通过调用触发System.gc(),但不能保证执行。JVM的垃圾收集收集创建的对象。
相信看到这里,大家对多线程应该有了基本的认识,那接下来咱们一起来看相应的学习路线。
是不是感觉比较繁琐?不用担心,在这里小编早已经将清华大佬的学习秘籍帮大家整理好了,为了不影响大家的阅读体验,小编只是展示了一部分细节,有需要深度学习的朋友,请帮忙转发+关注小编,在私信回复【学习】即可免费领取哦~~~
本章简单介绍了Java语言产生的历史背景。Java语言所要解决的是如何能够不关注底层技术细节就能实现兼容性,詹爷给出的答案是使用中间语言,通过中间语言来实现跨平台兼容的目标。
章节简介
本章主要讲解了JVM内部的call stub 例程的定义和调用机制,但是并没有一开始便直入主题,主要是考虑到技术的难度太大,很多人理解不了。因此作者只能用心良苦地设计了很多C和汇编程序,从物理机器执行函数调用的机制开始讲起,为大家揭开物理机器在调用函数时设计的若干细节。
章节简介
从程序的角度看,数据结构是若干数据的有机结合,一个数组、一个链表、一个堆栈都是数据集,这些数据在内存位置上有着紧密的联系,例如,对于数组而言,相邻的两个元素在内存位置上也是彼此相邻的;而对于链表,内存空间上未必彼此相连,但是相邻的两个元素中必定有一个元素保存着一个指针指向另一个元素的内存位置。而从人类的角度看,一个特定的数据结构可以更好地描述客观世界,例如通过一个Java类可以描述一只猫、一个手机,而通过类的组合则可以描述几乎任意复杂的事物。这便是数据结构的意义所在。
章节简介
本章以一个具体的Java程序为例,分析了其对应的字节码文件中的数据。可以发现,Java编译器在生成Javaclass字节码文件时,全是按套路出牌的,那么我们在分析时也按照套路走,便不难理解字节码文件的内容。
字节码文件中最重要的是Java方法所对应的字节码指令( 至少笔者这么认为), Java 源程序的逻辑都封装在字节码指令中。对字节码指令在字节码文件中的存储方式有了透彻的理解,便意味着你对JVM执行引擎入门了。
章节简介
本章详细分析了解析Java字节码常量池的原理,描述了JVM内部常量池对象的内存分配机制,并由此阐述了JVM内部的对象表示机制——oop-klass 模型。想要研究JVM内核的道友应当认真阅读本章,最好能够非常熟悉常量池的内存分配机制,因为后续章节会讲解Java字段、方法的内存分配机制,而Java字段和方法的内存分配机制基本与常量池的内存分配机制类似,因此对常量池的内存分配机制理解得越透彻,则后续理解其他对象的内存分配机制便会越轻松。
章节简介
总体而言,HotSpot 解析Java类变量的脉络比较清晰,但是也可以看出花了很多心思,这导致JVM虽然在执行引擎上相比于那些直接编译成本地机器码的编程语言可能要稍逊一筹, 但是在对象的内存分配上,并不比这些编程语言多浪费一点空间(除了每个Java类对象必须保留一个对象头),甚至由于字段重排的优化策略,对内存的利用率还要高于这些编程语言的编译器的分配算法。
章节简介
本章全面分析了Java方法栈帧创建的过程,机器指令几乎是逐个讲解的。然而,笔者在阅读JVM的这部分机制指令的过程中,不仅仅停留于分析机器指令本身的含义,还进行了更深入的思考,仔细推敲了每一条机器指令的背景,为何要这么实现,如果不这么实现有没有问题,相信真正有耐心读下来并且能够读懂的道友能够体会笔者的这种深人思考!
章节简介
本章主要描述了Java方法解析的技术实现。相比于前面章节所讲解的Java类字段的解析,Java类方法解析明显要复杂得多。这种复杂性体现在Java方法属性本身拥有众多信息,尤其是字节码指令部分。除了字节码指令,还有LVT、miranda 方法等,存储格式比较复杂,并且概念理解起来也并不是一-件轻松的事情。JVM为Java方法在内存中所构建的对等体也明显更加复杂。
同时,Java方法的解析还承担了一部分实现面向对象机制的责任,其核心技术便是vtable。只有真正理解了vtable 的实现机制,才能真正理解Java面向对象与多重继承的原理。
章节简介
JVM最核心的技术便是执行引擎,最难的也是执行引擎。要想透彻理解JVM的执行引擎,就必须先理解物理计算机CPU执行运算的机制。本书详细描述了物理CPU进行取值、译码、运算的原理,并从这个点出发,逐步深入讲解JVM的执行引擎的运行机制。
章节简介
类的加载机制与生命周期等概念,在各种书籍与各种网络博客里随处可见,然而对于一个想要真正了解其内部实现的人而言,那些都涉人过浅。本章“拨云见日”,从JVM源码的角度,还原出Java类加载的真实机制,以及类生命周期的实现方式。
章节简介
JVM涉及的知识面十分广阔,因此限于篇幅,本篇并未覆盖JVM的全部内容。总体而言,本篇重点描述了JVM从启动开始到完成函数执行的详细机制,读完本篇,相信你一定能够明白JVM执行Java程序的底层机制,能够明白JVM将Java语言一步步转换为CPU可执行的机器码的内部机制,以及为此而制定的各种规范的实现之道,例如oop-klass 模型、堆栈分配模型、类加载模型等。
所谓实战,并不是让大家空造项目,在这里小编整理了2020最新阿里面试真题,如果换做是你,你又能和面试官过上几个回合呢?
如果是你,你能达到什么程度?
学习是一个漫长的过程,只有耐得住寂寞,才能收获到成功的甘醇!!!
在这里,小编已经将此面试真题和前文的学习文档打包归类,有需要深度学习的朋友,请帮忙转发+关注小编,并私信回复【学习】即可哦~~~