当前位置: 首页 > 网络应用技术

我从冯·诺罗坦(Von Norotan)的计算机系统中从JVM追溯到JVM,一切都是如此!

时间:2023-03-08 16:42:08 网络应用技术

  不要害怕漂浮的云,只有最高水平

  在开始之前,假设我为什么从冯·诺曼(Von Norman)的计算机系统中追溯到JVM,一切都如此。因为凶猛的种子发现的问题是,大多数人总是想问什么知识,但是我经常不太问为什么(或我很少问为什么在知道什么之后,就像我想在本文中谈论的JVM一样,在阅读了很多文章“什么是JVM”之后?我实际上不明白什么是JVM,或者为什么JVM是这样?

  直到回到知识历史的起点,让我们看一下当前的知识。

  (理解知识背后的整个背景比纯粹记得艰苦的知识要深刻得多,因为前者会带来愉悦的思考,而后者只会使人们失去乐趣。)

  谁说的是?我用凶猛的种子说着眼泪。

  因此,我回到了冯·诺曼(Von Noonman)的计算机系统,然后返回操作系统以追踪JVM以查看整个上下文。

  回顾计算机开发的历史,我们都知道,冯·诺曼(Von Norman)被称为“现代计算机之父”,提出并奠定了迄今为止的von Normandan计算机系统,这是计算机结构。因此,我们必须知道这一点事实是,无论在物理机器上建造了哪种操作系统,并且在操作系统上构建了哪种虚拟机,或者上层应用程序与源相关。被笼罩在这个系统下)

  (那么为什么您总是可以在JVM虚拟主体上看到熟悉的计算机结构。)

  在计算机结构中,它由五个输入设备,控制器,操作员,普通话和输出设备组成。控制器+运算符是我们熟悉的CPU(中央处理器)。内存是内存,磁盘等。输入设备,例如:键盘,鼠标,输出设备,例如:监视等。整个计算机结构的操作如下:

  从上面可以看出,整个硬件已经分发。执行程序后,该程序将被视为数据,并且所有组合结构都可以视为数据/指令流和控制流。该程序就像数据(或指令)一样,只要可以操纵流程。正是冯·诺曼(Von Normann)的想法“该程序应作为数据存储。”

  计算机结构上还有另一层,即操作系统,操作系统可以说是虚拟机的发起人,因为操作系统的目的是如何控制物理机器。真实的物理资源(CPU,内存,磁盘)的优点进入可以通过盯着屏幕,敲键盘和绘制鼠标来控制现实的物理资源。

  是的,业务系统是“物理资源虚拟化”的本质!

  (考虑操作系统元素宇宙的起点?)

  在我们最常用的操作系统中,有两种类型的Windows和Linux,但是两个操作系统不兼容,然后将有一个程序不会同时在两个操作系统上运行。您必须开发分别。然后它将触发人类的第一批生产力(程序员)!

  不要笑!自从人类发明的发明以来,它从未停止释放重复的劳动。人类发明了洗衣机来代替洗衣机,洗碗机,而不是菜式,汽车替代车,并在1930年代提出,但至今仍是自动的,但至今仍在自动起火。。仅仅是虚弱的人工智能),但是从人类技术的发展的角度来看,人类正在逐步发展一个更常见的人工智能,即,有一天,超级人工智能超过了强大的人工智能并越过起点。只有程序员才能进行对话:

  程序员:“嘿Siri*:帮助我开发一个掘金,并帮助我安排一个凶猛的种子家伙写一个JVM。”

  程序员:“嘿,顺便说一句,Siri,别忘了给那个家伙一个钥匙,并且在文章中连续三个。”

  Siri:“ F*CK提到了需求。”

  程序员:“什么?”

  Siri:“安排”

  (很远,我希望您能吸引人类追求普遍的(懒惰)在JVM中的反映。)

  全名是Java虚拟机,除了Java虚拟机前缀Java。虚拟机实际上是在“虚拟(抽象)计算机”中,也就是说,一台计算机在操作系统上又是虚拟的,以阻止不同的硬件和操作系统,操作系统之间的差异是用户与物理物理之间的桥梁资源,然后JVM是不同硬件和操作系统的桥梁)。JVM的目的是具有普遍性,这就是我们经常说的Java可以在平台上开发。

  然后在JVM的这个时候很容易理解。JVM可以像计算机结构一样运行编写的程序,JVM主要由:加载程序,运行时数据区域,执行引擎和本地储层接口组成。

  我们知道,运行程序实际上只是我们中的一个定义(这些文件实际上是我们的程序员的抽象,然后实现计算机以帮助我们)。仅指定字节代码文件格式,此优势是显而易见的也就是说,不仅Java可以在JVM上运行,而且只要它可以生成字节代码文件,它就可以在JVM上运行,因此Java虚拟机也是如此,并且Java虚拟机也不是首选java language.jvm通过字节码存储格式统一所有平台,字节码是平台非理性的基石。类似:python,ruby,scala,scala和其他语言,只要它们可以转换为bytecode格式,那么它们就可以运行,然后运行它们在JVM上(可以说JVM的野心太大了!)。

  因此,如果文件是在顶部执行的,则必须首先将其从编译器转换为加载程序以加载类。整个机器。如下所示:

  当涉及虚拟机器装载机时,您必须说负载机制,并且一组机制肯定会有一个过程,即进入入口(装载机)到整个生命的整个生命周期:加载加载的类别,链接连接,初始化初始化,使用使用和不使用卸载。如下所示:

  但是,最重要的类文件加载过程是加载,连接和初始化的三个步骤。

  加载类加载过程的第一个过程无疑是加载的。如果尚未加载虚拟机,则字节代码文件将通过类加载程序加载到存储器中。当然,它也可以来自压缩软件包或格式,最后它只是一个类文件从中。

  尽管任何二进制都可以是类类型,但只能加载JVM的类文件类型可以在JVM上方运行。(即,可以传递必须符合虚拟机规范的字节码文件。)连接过程是连接的(以流行术语连接以与虚拟机建立类文件)。从上图可以看出,连接包括三个。程序:验证,准备和分析。连接的第一步是验证。验证将按照检查的四个阶段进行顺序进行:

  验证验证的四个阶段:

  在上面,我们知道该文件是由编译器编译的,并且文件中的内容是字节码,它记录您将通过字节代码使用的其他类或方法。

  例如,以下代码,我们通过打印来定义字符串类型变量。

  我们查看将代码编译到上面的副本代码中的内容,如下所示:

  您可以在代码中看到最常见的表达:

  在转换的字节码中,它使用符号引用来“替换”表达式:

  因此,符号参考验证是检查符号引用的类,属性和方法是否存在并具有访问权限的权限。

  上面有很多验证,但是无论哪种类型的验证都是为了确保班级符合Java规格和JVM规格,同时避免了虚拟机的安全性。

  要连接的第二步是准备。在此阶段,主要完成了两件事。为了分配内存空间并为经过验证的类设置。

  对于修改后的变量,我们将直接分配我们的定义值。您可以看到以下代码,该代码将在准备阶段分配内存并初始化值。

  每个数据类型的默认初始值,如下图所示:

  (注意:上图中没有类型。Java中类型的基础实现实际上是类型,类型默认值和相应的类型默认值。)

  分析连接的第三步是分析。解析阶段的工作是将符号引用转换为直接参考。由于编译时,它被符号引用替换(为什么称为符号引用,该符号仅是徽标),并且符号引用不为了解这些数据引用的实际地址。

  因此,如果您只面对一个符号引用的问题,则不能确定对象必须存在。因此,可以通过解析直接引用的可转换为JVM的内存地址或指针可以转换为JVM。

  当解析将符号引用转换为直接引用时,即目标已经存在于虚拟机的内存中(老实说,直接引用确定确定类,方法或属性)。

  初始化类的最后阶段是初始化。在此阶段,将执行构造方法。当我们前面提到的文件将文件编译到字节码文件中时,所有类初始化代码,即包括分配语句的静态变量,静态代码块,静态方法和静态方法。一起收集后,它将成为一种方法。

  简单摘要的目的是初始化程序员本身定义的值为程序员本人。

  此时,类的加载过程就像von Norotan计算机结构中的输入设备一样。将数据投入入口后,它确实在JVM内部(JVM操作的数据区域)。代码最终移交给了机器。

  当JVM运行时,数据区域主要分为五个分区:堆,程序表,方法区域,虚拟机堆栈和本地方法堆栈。它们,两个类别由线程和线程共享:

  JDK 8之前和之后,桩除以年龄,如下图所示:

  方法区域是螺纹共享的区域,就像堆一样。当Byte代码文件加载到JVM中时,它将分配给不同的数据结构,例如恒定池,方法和构造函数。类信息(类别信息包括类,字段,方法,界面和父类别类别作为类,字段,方法,接口和父类别。

  我们知道Java程序是由多线程执行的,因此我想满足多个线程的交叉执行,并确保多个线程可以完成各自的工作。然后,一旦发生中断的线程,必须保留哪个内存地址(指令),以便在恢复中断的线程时可以执行。

  这是程序总计的工作,用于记录当前执行哪个线程。程序控制流的指标)

  虚拟机堆栈虚拟机堆栈是线程的一个私有区域,因此无需关心数据一致性。当我们创建一个线程时,也会在JVM中创建相应的堆栈,称为虚拟机堆栈。

  虚拟机堆栈的内部实际上是一个或多个堆栈框架,每个堆栈框架对应于Java方法的调用。

  操作过程是,当我们创建一个新方法时,我们还将在虚拟机堆栈中的虚拟机堆栈中创建一个新的堆栈框架(当前堆栈帧)。当前的堆栈地址。如下所示:

  本地变量表,操作号码堆栈,动态链接,方法返回地址和其他信息,以参与每个堆栈帧中参与方法的方法。

  因此,如果堆解决数据存储问题,则堆栈是程序运行方式的问题。

  本地方法堆栈本地方法堆栈是准备运行JVM本地方法的空间(即方法)。字面原因称为本地方法堆栈,因为许多方法也通过C语言实现。

  如果说“加载子系统的类型是计算机结构中的输入设备,则数据区域是计算机结构中的CPU(控制器和操作员)和内存。那么最终输出设备是执行引擎。”

  当涉及执行引擎时,可以说这是JVM的最后一个链接。从第一个Java源文件中,它通过类加载子系统将其编译到字节码文件中。系列后,流行的Word代码文件已被粉碎并重组为一系列可以由JVM控制的数据(回顾一下计算机结构,数据正在流动,并且安排了良好的局),但问题是无法执行代码。由于JVM不会将高级语言直接转换为机器指令,而是字节代码,实际操作执行引擎可以翻译字节代码,以将字节代码转换为机器指令,并执行真实的物理机器。

  但是我们知道JVM仅对计算机来说是抽象的,并且一切仅基于软件级别。物理计算机只能理解机器代码指令。这些机器代码指令通过处理器,缓存,指令集和操作系统运行实体机的执行引擎。

  因此,JVM希望运行Java程序进行运行,并且还必须在“ Virtual(类似地)”中“执行执行引擎”,而执行引擎的目的是解释字节代码指令(编译)到机器指令。

  因为返回本质,真正有效的是物理机器,执行引擎是将字节代码转换为可以由物理机器执行的机械代码(从用户的角度来看,它是转换器)

  我们使用的热点VM是当前虚拟机的代表之一。这是一个集成了口译员和JIT即时编译器的架构。也就是说,当Java虚拟机运行时,解释器和JIT(正好及时即时编译器)相互合作。

  早期JVM中使用的解释器来解释解释器(大多数语言也是)。解释器将向机器代码解释字节代码以在运行时执行程序。是必要的“添加翻译器”方法,以避免直接将高级语言耦合到本地机器指令中。不要忘记重要的事情。JVM虚拟机是一个概念。不要忘记目的是普遍)

  在Java的开发过程中,从最早和最古老的字节码解释器开始。此后,模板解释器当前通常使用。有两组解释执行器。字节码解释器模拟通过纯软件代码,纯软件代码的执行,因此,效率也很低。模板解释器与每个字节模板和模板函数关联,并且在执行字节代码时,模板功能可以直接生成机器代码,从而改善解释器的性能。

  但是,仅字节代码解释器的效率是不够的,因此,为了追求即时的速度推动,虚拟机添加了JIT,即即时编译器。

  JIT Instant Instant Compilers知道,在JVM执行引擎后,添加了字节码解释器,添加了JIT,并且在使用JIT将字节代码转换为机器代码指令时,核心的关注点是程序中的调用经常是该程序的调用。在呼叫代码期间经常调用称为“热代码”。

  要查找这些“热代码”,您需要使用JIT热点。当前的主机点的JVM使用基于反热点检测的热点检测。计数热点检测是充分了解的,即每种方法的执行时间。当超出热点阈值时,它属于“热点代码”。

  冷却热点检测被分为方法呼叫计数器和后柜员。方法用于计数调用计数器计数呼叫的数量,而边框计数器则用于计算执行周期的数量。

  除了增加计数器的数量外,还有一个热衰减,也就是说,当代码呼叫的数量超过一定时间时期时,它不会提交给JIT,因此呼叫计数器会减少。

  小心的朋友会发现,以前的Redis的记忆消除策略中的LFU算法非常相似。在上一篇文章中,如果您有兴趣,您可以仔细研究它,并且不会在此处详细介绍。

  REDIS如何求解缓存以承担内存?

  边界计数器的主要目的是触发OSR(在堆栈编倍)堆栈中。在某些周期周期中,该代码将直接替换代码以直接执行高速缓存机代码。

  如果本地方法接口和本地方法库需要与JVM中的某些基础系统进行交互,则将使用本地方法界面和本地法律库。或等待其他语言的资源。

  我们了解到,计算机结构意识形态程序应该像数据一样存储,也就是说,该程序就像数据(或指令)一样,只要该程序就像组件流一样构建。查询操作系统的本质是实际上,物理资源的虚拟化,可以说是用户和物理资源之间的桥梁。最后回到JVM实际上是一台虚拟(摘要)计算机。如果类加载子系统是计算机结构中的输入设备,则数据区域是CPU(控制器和操作员)和计算机结构中的内存。然后最终的输出设备是执行引擎。

  此时,JVM还具有加载的双极分配机制,以及JVM的垃圾回收机制,JVM堆栈和其他异常,以及JVM配置参数和其他内容不说话,因为这些内容值得它因此,本文可以用作JVM的首发文章,也可以说是JVM的地图。至于您如何理解整个知识,您取决于自己的思维。

  ?好吧,这是在超过两个星期内。

  好的,实际上就是一个多月。

  (最后,我们在von Norotan系统下没有新的计算机结构,但是我们可能希望大胆地想象未来,并且我们可能会在远非实用和遥远的量子计算机上看到它。)

  我是一个凶猛的种子。我害怕真相,一个英寸和一个英寸的喜悦。谢谢您的朋友:跟随,喜欢,收集和评论,让我们下次看看!

  创作并不容易,不要责怪。

  凶猛的种子|文字[原始]

  该文章继续进行更新,您可以关注微信公共帐户“凶猛的种子”,以敦促更多并阅读第一次。

  原始:https://juejin.cn/post/7098500546297856030