与联合核查团的访谈 -- -- 业务结构
来源:http://www.tudoupe.com时间:2021-12-04
JVM 结构
这是关于联合核查团的内部运作框架。
虚拟机的意义
爪哇作为一种先进的程序语言,是一种非常复杂和抽象的语法语言,因此直接用硬件执行这一复杂过程是不可行的。 因此,在使用爪哇之前,我们必须转换它。
硬件可以提供爪哇虚拟机器,但更经常地是,现有平台上可以提供软件(例如,关键是,程序一旦转换为爪哇字节代码,它可以在许多平台上以虚拟机器操作。我们常说,“一个写,一个运行 ” 。
虚拟机器的另一个好处是它包含了一个托管环境(Managed Runtime ) 。 这种托管环境可能取代我们处理代码中一些更长和容易被误解的部分。 其中最著名的是自动记忆管理和垃圾回收,这甚至催生了废物回收作业的浪潮。
虚拟机器的使用还具有在汇编和翻译过程中优化和简化程序、提高执行效率的优势。
虚拟机结构
如所示,联合核查机制主要由级装载器子系统、运行时间数据区、执行引擎和与当地方法的接口组成,还包括一个方法区、堆叠区、爪哇仓库、个人计算机登记册和一个当地方法仓库。
如上图所示,所有爪哇线条都共享记忆空间中的方法区域和堆叠,但Java Lodge、当地方法站和PC登记册每条线都是私人持有的,造成各种问题,以后将详细探讨。
众所周知,爪哇是一种跨平台语言,也是由JVM.More(JVM.More)在多个平台上利用JVM的成就来帮助我们解决平台相关性问题,仿佛HTML语言可以在不同制造商的浏览器上展示组成部分(尽管某些浏览器在实施W3C标准方面有一些挑战)。 同时,爪哇允许通过JNI使用短距离方法,但应该指出,如果使用Lo平台,则会受到当地技术的危害。
玻璃装入器分类
- 启动类加载器(BootStrap Class Loader):启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责将<JAVA_HOME>/lib路径下的核心类库或 -Xbootclasspath 参数指定的路径下的jar包加载到内存中,注意必由于虚拟机是按照文件名识别加载jar包的,如rt.jar,如果文件名不被虚拟机识别,即使把jar包丢到lib目录下也是没有作用的(出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类),在 Sun JDK中,这个类加载器是由C++实现的,并且在 Java 语言中无法获得它的引用。
- 扩展类加载器(Extension Class Loader):扩展类加载器是指Sun公司(已被Oracle收购)实现的sun.misc.Launcher$ExtClassLoader类,由Java语言实现的,是Launcher的静态内部类,它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库,开发者可以直接使用标准扩展类加载器。
- 系统类型装载器( System Glass (.) der ): 也称为应用程序装载器, 它负责装入系统类型路径 java- crapspath 或 Djava。 抱歉, 类。 Path 定义了路径下面的库, 也就是我们经常使用的单路路径, 开发者可以直接使用系统类型装载器, 通常是程序默认的类装载器, 调用太阳。 对不起, 小姐. Launcher $AppClass Loa 。
ClassLoader#getSystemClassLoader()函数可用于装入器类型。 我们开发的 Java 类通常也由 Glass 装入器装入。 在 Sun JDK 中, 系统类型装载器被称为 AppClass 装入器 。 - 用户定义的类装载器(用户定义的玻璃装入器):用户定义的型号装入规则能够对装载过程各个阶段进行手动控制。
玻璃装载器的内部操作。
载荷、链接和初始化是三类类载荷。
装载
类文件已装入 JVM 。 当该类被装入时, 类别会在 JVM 中以“ 分类完整名称+ClassLoader 示例 ID” 信号信号 。
克拉斯装载器的例子和类别储存在堆积中的记忆中,其类型信息储存在方法领域。
装货过程采取所谓的“父母代表团模型”的形式,在这种模型中,一个克拉斯装载器首先要求其父母格拉斯装载器(实际上,这里只有两辆玻璃装载器,因此父亲更能理解)装载一个舱,而其父母克拉斯装载器将继续向更高层的克拉斯装载器提交装载请求,直到装载器开始。
母舱分配模式是JVM的第一安全防线,它提供舱安全装载,并基于班级装载器隔离的概念:即使同一类由不同级装载器装载,也不可能在多级装载器之间直接沟通,而且它们不知道对方的存在。 使用朗没有风险,因为它不能由启动级装载器装载。
还可以证明,如果用户定制了班级装载器,他或她必须确保班级负荷的安全。
链接
该链接的任务是将二进制类型信息整合到 JVM 的运行时状态中。
链接分为以下三步:
无法将文件“%s”复制到“%s”:“%s”
准备就绪: 向类分配内存, 而起始类的静态变量则指定默认值 。
分解(可选):类常数集合中的符号引用通常被视为直接引用,当需要适当引用时,可以重复这一步骤。
初始化
初始化该类静态变量,执行该类状态代码和创建方法。
JVM标准规定该类别何时必须初始化:
- 当使用新关键词、反射、克隆和反顺序进程演示物体时。
- 使用班级静态方法
- 当您使用或添加一个值到一个类的静态字段时。
- 当使用有反射信号的方法时。
- 类别子类别初始化(在可初始化子类别之前,必须先设定父子类别) 类别子类别初始化(在可初始化该子类别之前,必须设定母子类别)。
- JVM被归类为启动类(简单定义为包含主要功能的类别)。
运行时数据区
方法区、书架、Java Lodges、PC储存库和当地方法仓库由运行时数据区组成。
爪哇堆
Java House的主要责任是保存方法参数、当地变量、中间计算,并为其他模块的部分工作提供数据。
Java Café 总是连接到线条, 每次建立线条时, JVM 都会生成匹配的 Java Lodge 与线条的匹配 Java Lodge 。 在这个 Java Lodge 中, Java Lodge 有许多堆叠( 堆叠框架), 这些堆叠( 堆叠框架) 与每种方法相连, 每个运行方法都产生一个块块, 每个有本地变量、 操作垫板和方法返回值等信息。 现在只有此活动的本地变量可以在操作仓库中使用, 当此框中调用另一种方法时, 产生一种与其相对应的新的白金, 新建的白金被放在 Java 仓库的顶部, 并转换成当前活动仓库 。 因此, 现在只能使用此仓库中的本地变量, 当所有指令被调用时, 只能使用此仓库中的本地变量 。
因为 Java House 与线索相对应, Java House 的数据与线索并不相同, 因此不必担心其数据的一致性, 也不存在同步锁定问题。
它由三部分组成:一个地方可变区、一个业务仓库和一个框架数据区。
局部变量区
本地变量区域是一个字长数组, 字节、 短类和 字符类转换成存储的整型, 但长型和双型除外, 长型和双型只有一个字长度。 编译时, 布林型转换成 int 或 byte 类型, 布林型处理为 byte 字型阵列换换 变量区域, 布林 数组处理为 字长数组, 字型、 短型和 Char 类型转换成 储存的整型, 除了长型和双型, 只有一个字长度。 编译时, 布林型转换为 int 或 byte 类型, 布林 数组处理为 byte 类型 。
方法参数和本地变量包含在本地变量一节中。此外,示例法意味着第一个本地变量,即与该方法被称作对象的对象链接的本地变量。对于对象,本地变量区域总是仅包含对堆叠的引用。
操作数栈
该操作同其名称一样,是一个单词长的阵列,只能进行进出的基本操作。在计算期间,作业次数被弹出,计算在进入仓库之前已经完成。
帧数据区
框架数据领域的主要职责如下:
记录点用于帮助解决问题的常数池的指针。
帮助方法的定期返回, 包括该方法的重新调用, 将 PC 注册器设置为与调用方法相对应的下一个指令, 并将返回值按到调用操作编号 。
创建异常情况表,在异常情况中通过对相关Catch条款的控制,未能确定相应的Catch条款,将呼叫方法恢复到标点,并重新处理异常情况。
在汇编时,本地可变区和操作堆叠的大小由特定方法决定。当调用该方法时,在方法区发现相应类别的信息类型,从该方法区检索特定方法的本地可变区和操作坑的大小,将内存分布并按到爪哇。
《爪哇虚拟机器法》为这一节提供了两个不同寻常的条件:如果一线请求的深度大于虚拟机器允许的深度,则该请求将被从库存流出异常点中丢出;如果虚拟机器能够动态扩展,如果在扩展时无法申请足够的内存,它将被丢出外部记忆异常点。
本地方法堆叠(本地方法存储库)
本地方法商店与 Java Lodge 相似, 因为它主要保存了当地方法所呼吁的国家。 不同之处在于 Java House 服务于 Java 方法的实施 Java 方法,而当地方法商店服务于 Java 方法的实施。 本地方法商店还排除了 StackOverpollError 和 Outof MemoryError 的异常现象。
PC 仓库/程序计数登记册(PC 仓库/程序计数登记册)
严格地说,这是一个数据结构,它保存了当前执行中的程序的记忆地址,而且由于爪哇支持多两次执行,因此程序执行的轨迹不可能总是线性。 当多个线条被交叉执行时,必须保留中断的线条当前执行的记忆地址,以便中断的线条可以在中断的指令的地址恢复。为了能够在线开关后返回到正确的执行位置,每条线条需要一个独立的程序反射器,将线条连接在一起,并单独存储,我们称之为这种类型的内存的“线性私人”内存,这种内存与“Tread Loral”有点类似,以安全的方式。
方法区(计量区)
类型信息和类别静态变量在方法区域中保存。以下数据储存在每一类别的方法一节中:
- 走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走,走
- 类类型 (类或接口)
- 接入的修改(公开、效果和最终)
- 已经实现的接口完整名称列表
- 常量池
- 字段信息
- 方法信息
- 静态变量
- 引用的玻璃加载器
- Class引用
可见类别中的所有信息都保留在方法区域中。由于该方法区域由所有线索共享,它必须是安全的。例如,如果两个类别都装入一个尚未装入的类别,一个类别将要求它装入所要求的类别,而另一个类别只能等待而不是重新装入。
常数集合本身是方法区域中的数据结构 。 Constant 集合存储, 如字符串、 二进制变量、 类名和方法名称常数 。 常数集合在汇编过程中被识别, 并保存在编辑的. Class 文件中 。 通常分为两类: 字数和应用程序量 。 字数是字符串, 一个二进制变量 等 。 最常用的参考是, 在调用该方法时, 根据其名称查找该方法的参考值, 并将其作为函数来执行函数代码 。 引用包括: 分类和界面、 字段名称和描述符、 方法名称和描述符的许可指定 。
此外,为了加快方法的使用,常常为每个非抽象类别编制一个私人方法清单,这是一系列直接指向可能需要的例子。
在 Sun JDK 中, 方法区域与永久代相对应, 默认最小值为 16MB, 最大值为 64MB。 大小可以通过参数调整, 起始值由 - XX: PermSize 提供, 最大值由 - XX: MaxPermSize 指定 。
堆(Heap)
书架是JVM控制的最大存储器,由所有Java线锁共享,没有线条安全,是在JVM开始时产生的。
存储对象和阵列值的堆叠示例。 如 Java 虚拟机器代码所描述的那样, 堆叠是 Java 对象存储地点: 所有对象和群集的示例都分布在堆叠中。 堆叠中的数据类型有一个指针, 指向方法区域的相应信息类型。 指向方法表格的指针也可以存储在堆叠中。 堆叠由所有线索共享, 因此, 当操作如演示对象时, 需要解决同步问题 。 此外, 堆叠中的样本数据中包含对象锁, 并可能存储用于不同垃圾收集策略的参考计数或清理标记等数据 。
SunDK从1.Verion 2开始给管理带来代际方法,主要分为新一代和老一代,代际方法大大提高了垃圾收集效率。
一代Y一代人
在多数情况下,新物体被分配给新一代,这些新物体由一个常年空间和两个相同的幸存者空间组成,大部分用于小GC复制物体(此处没有深入解释小GC的机制)。
为了更有效地分配记忆,JVM将在EdenSpace建立一个小的、独立的TLAB区域。 我们知道堆叠上的内存分配需要锁定整个堆叠,但并不锁定TLAB,因此JVM将试图将目标分配给TLAB,以提高绩效。
发展/老龄
在新一代中持续了很长时间的项目将迁移到老年,在那里,废物收集的频率低于新一代。
执行引擎
执行引擎是联合核查团实施爪哇字节代码的核心,主要通过解释执行、汇编执行、优化执行和硬件芯片实施加以实施。
JVM指挥系统基于仓库而不是登记册,其好处是,它可以尽可能紧密,以便能在网络上迅速传递(铭记最初为网络创建了Java),并且可以随时改变为共同登记册中较少的平台,以及代码优化,因为Java House和PC发送器是私人拥有的,因此无法优化代码。
JVM 命令由单字节代码和若干操作组成。 对于需要操作次数的命令,操作数量通常先被压缩到操作堆叠中,甚至连本地变量都分配给它们,然后再分配给它们。
解释执行
JVM 可以用与其他动态语言相同的方式解释执行字节代码。 Sun JDK 使用象征性威胁,有兴趣的学生可以对此进行更多研究。 优化实施MayM 有很多技术可以与其他动态语言一样解释执行字节代码。 Sun JDK 使用象征性威胁,感兴趣的学生可以对此进行更多研究。 优化实施有很多技术:
- 抓取缓存 : 操作堆叠顶部的值将立即缓冲在登记册上, 对于只需要一个操作数的大多数指令, 将不需要进一步输入, 并且可以在登记册上直接进行计算, 其结果会被压缩到操作登记册中 。 这样会降低注册和内存交换成本 。
- 部分共享:呼叫方法允许调用方法使用操作堆叠作为自己的本地可变区域,在获取方法参数时降低复制参数的成本。
- 执行机器指令: 在极少数情况下, JVM 将执行机器指令以加快速度 。
编译执行
Sun JDK为将字节转换成机器指令提供支助,主要是利用JIT(Just-In-Time)汇编器在操作时进行汇编,该汇编器将汇编第一次执行时机器代码和缓存的字节代码,并随后再使用,Oracle JRockit采用综合汇编作业。
自适应优化执行
调整以优化实施的想法是,该过程中10%的代码占执行时间的80%,因此,将该代码的一小部分转换为优化的机器代码,可以大大提高执行效率。 自我调整优化的典型代表是Sun的热点 VM,该热点 VM与名称一样,监测该代码的实施,当根据特定方法判断存在瓶颈或热点时,将激活后台线,将该方法的字节代码转换为超优化的静态链接C++代码。 当该方法不再是一个热区时,将删除所编的代码,并重新执行解释。
自我适应优化不仅利用了一小部分汇编时间,赢得了最大的效率优势,而且还在很大程度上促进了内部代码等优化,这是在执行过程中持续监测的结果。 由于物体的多形态特征,一种方法可能以多种不同方式实施,而仅仅通过监测所使用的代码,内部功能的规模就会大大缩小。
Sun JDK是使用两种模式汇编的:客户和服务器。前者轻量级,消耗的内存较少,而后者则有更大程度的优化和消耗更多的内存。
在服务器模型中,对目标进行飞行分析,即如果方法中的目标在方法之外使用,或者如果使用另一种方法,目标将是逃犯。对于非逃逸对象,JVM将对象直接分布在柜台上(因此对象不一定分布在堆叠上),对对象的线性访问速度更快,当方法返回时,还有利于收集由于放弃白金而导致的物体废物。
此外,执行引擎必须确保线路的安全,使执行引擎也能确保JMM(Java记忆模型)的安全。
JMM代表爪哇记忆模型。
Java记忆模型(Java记忆模型)为Java进程中的许多变量(线性共享变量)以及诸如JVM中保存记忆变量和从记忆中检索变量等低层次特征提供了访问限制。
当许多线索同时读取和更改主内存中的共享变量时,该变量会以副本的形式读取到自己的工作内存,并更新副本以更新变量在主内存中的位置。
(由于 CPU 时间胶片是最小的线条单位, 这里的工作内存实际上指在 CPU 活动期间接收数据的物理缓存; 主内存指保存原始共享变量的内存 。)
JMM的主要技术方面围绕多线原子、能见度和秩序。
原子性:
原子主义意味着操作是不可阻挡的。 尽管许多线条同时运行,但一旦操作开始,它就不会被其他线条打断。
可见性:
当线条修改共享变量的值, 而其他线条立即意识到该变化时,便会出现可见性。 序列法的可见性没有困难, 但多线化案例存在更多问题 。
有序性:
出现顺序问题的原因是,在程序进行时,可以重新安排指示的顺序,而重新排序的顺序可能与最初指令的顺序不同。
- 所有变量都保留在主内存中。
- 每个线条都有自己的独立工作内存,其中含有在线条中使用的变量副本(主内存中变量的副本)。
两条规定
- 共享变量的线索必须在其工作内存中执行,而不是直接从主内存读写。
- 各行之间无法直接获取其他线性工作记忆中的变量,而内线变量值的转移需要使用主内存。
- 传播变量图示说明的理由
可见性
在一个线索中对共享变量值的修改实时反映在其他线索中。
对线索1中共同变量的修改必须经过两个过程,才能及时由行2查看:
- 将共享变量从工作内存 1 刷新到主内存 。
- 工作内存 2, 更新最近共享的内存变量值 。
可见性分析
以下是共享变量不显示在网上的原因:
- 线程的交叉执行
- 链接中的交叉执行应重新排序。
- 更新的共享变量值在工作内存和主内存之间的整个时间间隔中不会改变。
通过同步实现能见度。
- 共享变量的最新值必须更新到主内存,才能打开线索 。
- 当线索锁定时,工作内存中共享变量的值为空,因此当访问共享变量时,读取主内存中的最新值(注意:锁定与解锁相同)。
这两个点的结合可以保证,在线条解开前对shremed变量所作的更改在下一个锁的其他线条上是可见的,因此,共享变量在线条之间的可见度是共享变量的。
串列执行的交叉编码 :
- 获得互斥锁
- 清空工作内存
- 将主内存复制更新到工作内存
- 执行代码
- 更新的共享变量值将刷新为主内存。
- 释放互斥锁
重排序
重新排序:当代码撰写顺序与实际执行顺序不同时,对指令进行重新排序,以便汇编者或处理者能够提高程序的效率。
指示的重新排序保持语义一致性,但无需确保若干线索的语义一致性。
这些指示的重新排列主要是为了改进业绩。
为什么重新安排订单会提高性能?
通过减少对执行流的干扰,CPU处理性能得到改进。
分类:
- 重新排列优化编译器( 压缩机优化) 文件 。
- 命令级别命令的平行重新排序(程序优化)
- 内存系统应重新排序(处理器优化)。
as-if-serial
无论如何,程序执行结果应与代码执行结果( Java 编译器、运行时间和处理器将保证 Java 在单行下尊重一连串同义词)保持一致,重新排序不应引起单行的记忆可见度问题。
- 第1行和第2行可以在一条线上重新排列顺序,但第3行不能。
- 就单行而言,重排顺序不会引起记忆能见度问题。
- 当多线程序错开时,重新排列顺序可能造成明显的内存困难。
下列概念管辖命令重排顺序:
- 程序性秩序的概念:线条中的语义同义词
- 波动规则规定,在阅读前写出波动变数,可确保波动变数的可见度。
- 锁定规则: 在进一步锁定前必须解锁 。
- 被动:A先于B,B先于C,然后A先于C。
- 在每次行动之前,他都称启动程序为线索。
- 线线活动之前 都有线线的终止
- 线线的中断在代码中断之前就已经发生。
- 对象的构造功能被执行,结尾前有
finalize()方法
通过波动性实现可见度
波动性关键字
- 确保波动变量可见。
- 无法关闭临时文件夹:%s。
如何使变异能取得记忆能见度:
深度:通过引入记忆障碍和禁止重新排序实现优化。
流行的说法 : 需要波动变量从主内存中重写变量的值, 每次它被线条访问时, 都需要从主内存中重写变量的值, 当变数变化时, 线条被迫将最新值刷新到主内存。 这样, 变量的当前值在任何时刻都会在不同的线条中可见 。 易变变量需要从主内存中重写变量的值, 当变量被线条访问时, 当变数变化时, 线条被迫将最新值刷新到主内存时 。 这样, 变量的最新值总是在任何特定时间在不同线索中可见 。
在写入波动变量后,添加一个存储屏障命令。
- 存储命令强制在写入操作后更新到主内存的最新值。 它还阻止 CPU 重新排列代码的优先次序, 以确保主内存中的值达到当前值 。
读取操作前,在读取挥发变量之前,将附上负载屏障规范。
- 在读取操作前, 负载命令将清除工作存储缓存中的值, 然后读取主内存中的最新值 。
线性挥发变异变量的程序如下:
- 修改线性工作内存中挥发性可变副本的值。
- 更新从工作内存到主内存的修改副本的价值。
读取可变变量程序的线条 :
- 读取从主内存到工作内存的最新波动变量值。
- 读取挥发变量的工作内存副本。
挥发性不能确保原子主义。
从装入到存储到记录和档案管理屏障有四个阶段,其中最后一个阶段jvm允许在所有线索中看到最新变量的价值,即后者允许所有CPU核心获得最新值,但中间阶段(从装入到存储)不安全,其他CPU更新数据丢失。
在已分配变化不定变量的情况下,不依赖该变量。
比如:
保证方法功能的原子性质
解决方案:
- 使用同步关键字。
- 本文是我们特别报导2011年叙利亚抗争的部分内容。
- 请接受我的歉意,(原子麻袋)
无法启动 Evolution 的邮件组件 。
为了在完整的多线线上稳妥地利用波动变量,必须遵循下列条件:
对变量的写入与其当前值无关。
- 数字++, 计数=账号* 5 不满意 。
- 满意:布林变量,温度变化变量,等等。
此变量不是包含其他变量的常数的一部分 。
- 不满足:不变式
low < up
- 不满足:不变式
内存屏障
内存屏障是一个 CPU 命令 。 Essentially, 它是一个指令 : (a) 确保执行某些操作的顺序 ; (b) 影响某些数据的可见度( 这可能是执行某些指令的结果 ) 。 编译者和 CPU 可以以与输出结果相同的方式重新排序指令, 以便优化性别 。 插入一个内存屏障, 这相当于告诉 CPU 和编译者必须先执行命令, 然后再执行命令 。 内存屏障的另一个功能是强制在不同 CPU 之间同时执行一个缓存 。 例如, 写屏障可以刷新在缓存障碍前写的数据, 这样任何试图读取数据的线索都会更新, 而不考虑哪个 CPU 核心或者哪个 CPU 被执行 。
Store Barrier
存储屏障是X86“栅栏”指令,要求在实施存储屏障指令之前执行存储屏障指令之前的所有存储指令,并将存储缓冲数据提供给 CPU 缓冲缓存。 这将让其他CPU可以使用该流程的状态, 允许其他CPU按需要进行干扰 。 一个很好的实例是“ 批发vent 处理器 ” 。
Load Barrier
《负载屏障指令》是对x86的“理由”指令,该指令要求在《负载屏障指令》执行后执行任何符合《负载屏障指令》的负载指令,直至CPU在《负载指令》执行之前读懂了负载缓冲区。 这使得从其他CPU上可以看到程序状态,在此之后可以跟踪CPU。
Full Barrier
在x86上,完整屏障,通常被称为“防守”命令,将拉拉的能力和节省屏障结合起来。
读写64位(长、双倍)变量可能不是原子变量。
Java 内存模型允许JVM将没有被 volatile 修饰的 64 位数据类型读写操作划分为两次 32 位的读写操作来进行,这就会导致有可能读取到“半个变量”的情况,解决办法就是加上 波动性关键字。
Vinal还可能确保内存变量在线条之间可见。
Finnal变量的设计是为了通过限制CPU操作的顺序,提供现成可见度,以确保物体的安全释放,防止物体的参照线被其他线条截取和使用,然后才能完全建造物体。
读取并写入最终域名的行为更像正常变量而不是锁定和波动。 编译者和处理者对最终域名遵循两条重新排序规则 :
- 构造函数中的二进制字段的写法不能在两个操作和随后将创建对象的参考值指定为参考变量之间重新排列顺序。
- 在对含有二元域的物体进行一读和随后对二元域进行一读之间重新排列顺序是不可行的。
问题:
1. 在Windows,代码被汇编成玻璃文件,能否直接在其他操作系统运行?
当然,当 Java 文件已经建成并转换为 Java 字节文件时, 它是一个玻璃文件, 被其他系统使用 。
2. 爪哇可以以什么不同方式实现?
软件和硬件,重点是软件。
什么是JVM的部分吗?
级装载器子系统、运行时间数据区(RAM)、执行引擎以及与当地方法的接口都是级装载器子系统的例子。
4. 什么是运行时间数据区?
它由一个方法区、一个堆叠室、一个爪哇仓库、一个PC登记册和一个当地方法仓库组成,由所有爪哇线和爪哇柜台共用的记忆空间中方法区和堆叠室、一个当地方法仓库和每个线索私藏的PC登记册。
4个部分组成:
- PC Depostor/Program count: Line private; 注意命令执行的位置, 不在此显示 。
- Java Lodge:线条是私人拥有的、生命周期和线同步的、储存方法参数、当地变量、中间计算,而且存在反常现象:如果线条要求比虚拟机器允许的深度更深,它们就会被扔出StackoverflowError异常现象;如果虚拟机器可能动态扩展,如果在扩展时无法申请足够的记忆,它们就会被扔出外部记忆错误异常现象。
- 区别在于 Java House 服务于 Java M 实施 Java 方法,而当地站则服务于 Java 方法。 当地方法商店也推出StackOverplowError 和 Outof MemoryError 的异常现象。 在 Sun JDK 中,当地方法商店与 Java 相同。
- 堆叠: JVM 处理的最大内存由所有 Java 线锁共享, 没有线条安全, 并且有 StackoverflowError 和 OutofMemoryError 异常 。
- 在方法领域节省了线条共享以及类型信息和类别静态变量。
5. 哪些因素可能导致跨平台进程?
在这一程序中,当地技术不是跨平台的。
6. 爪哇如何在地方一级使用爪哇语?
这是通过使用JNI(Java Live界面)技术实现的。
7. 启动级装载器如何开始装载?
这不是爪哇类, 所以不需要加载; 它嵌入爪哇的虚拟核心, 即“ 诱饵陷阱”, 当 JVM 启动时即启动; 它的二进制代码以 C++( 不是字节) 写入 。
8号太阳,对不起,小姐。 Launcher的ExtClass装货机和Java。 来吧,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走
除了起步班装货机之外,所有东西都是从爪哇继承的。 来吧,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,我们走,
9. 如何设置不同种类的装载器?
所有其他班级装载车都已经通过。sun.misc.Launcher获得静态内部类,扩展级装载器为ExtClass Loader,而应用式装载器为AppClass Loader。
类型加载程序是什么?
装入、连接(检查、准备和解析)和初始化
- 正在装入: 以类类 全部名称和类类 类 装载类别, 基本上要指定 。 类文件 加载到 JVM 中 。
- 检查分类文件的有效性,确认它符合规范规格,对目前的联合核查机制来说是可以接受的。
- 准备就绪 : 将内存分配到类中, 而起始类中的静态变量设置为默认值 。
- 解析:大多用于将类常数集合中的符号引用转换为直接引用;如果使用相关引用,此步骤可以重新解释。
- 初始化: 在初等班创建静态变量, 并运行状态代码和类构建方法 。
11. 使用哪些模型解释装载过程?
双亲委派模型。
当要求某一类装载器装入时, 首先委托给母负载器, 如果母负载器能够完成该类装载器, 则返回成功; 只有当母负载器无法完成该负载器时, 它才能自行装载 。
Java的虚拟机器在装载一个类时会使用哪类装载器?
- 最初,现有线条的班级装载器将运到一线负荷的一等(假设为A级)。
注:当前线索的分类装载器可用线索类的 GetContextClassloader () 方法检索,或使用设置ContextClass Loader () 设置。 - 如果A类引号为B类,爪哇虚拟机器将使用装载A类的A类装载器装载B类。
- 还可以直接调用
ClassLoader.loadClass()函数,用于指定装载类时使用的类别装载器
12. 父母责任意味着什么?
调试机制的含义是防止多字节出现在记忆中。
例如,在A类和B类中都有系统类:
- 如果您自己加载而不是调试, A类会加载一个系统字节代码, B类会加载一个系统字节代码, 导致两个系统字节数字的内存 。
- 如果使用佣金机制,则对母体进行反向检查,即:如果没有额外的下限,最好的替代办法是尝试用诱杀装置装载。这里的系统可以在诱杀装置中发现和装载,如果B类也装载系统,从诱杀装置开始,那么“诱杀装置”看到系统已经装入,并立即返回内存,而无需重新装入,因此内存中只有一个系统字节。
13号,你能自己想个名人吗?java.lang.System?
一般说来,这是无法实现的,但可以用其他方法来满足这一需要。
加载舱使用一种委员会机制,以保证父亲优先,父亲可以发现型号,儿子没有机会上载。 系统级由布茨套装式装载器装载,即使重新安装,也总是使用由爪哇系统提供的系统,没有机会装载它为自己创建的系统级。
但出于这个原因,我们可以为自己设计一种装货机,这种装货机也必须是特殊的,以防止母体委托机制。 因为系统本身携带的所有三种装货机都是特定目录下的装载机, 如果我们自己的装货机被放在一个特殊的目录中, 系统装货机是无法装货的, 也就是说,最终我们自己的装载机是无法装货的。
什么时候在JVM发生类装货行为?
- 当使用新关键词、反射、克隆和反顺序进程演示物体时。
- 使用班级静态方法
- 当您使用或添加一个值到一个类的静态字段时。
- 当使用有反射信号的方法时。
- 类别子类别初始化(在可初始化子类别之前,必须先设定父子类别) 类别子类别初始化(在可初始化该子类别之前,必须设定母子类别)。
- JVM被归类为启动类(简单定义为包含主要功能的类别)。
连续池发挥什么作用?
常数集合是方法区域中的数据结构。常数集合持有字符串、二进制变量、类名和方法名称等常数。常数集合在汇编过程中被识别,并保存在编辑的.Class文件中。通常分为两类:字数和应用量。字数是字符串、二进制变量等。分类和方法名称属于参考量。
十六岁,你能描述一下爪哇的记忆模型吗?
Java记忆模型(Java记忆模型)为Java进程中的许多变量(线性共享变量)以及诸如JVM中保存记忆变量和从记忆中检索变量等低层次特征提供了访问限制。
17点能看到什么?
在一个线索中对共享变量值的修改实时反映在其他线索中。
你是什么意思,顺序?
出现顺序问题的原因是,在程序进行时,可以重新安排指示的顺序,而重新排序的顺序可能与最初指令的顺序不同。
什么是原子弹?
原子主义意味着操作是不可阻挡的。 尽管许多线条同时运行,但一旦操作开始,它就不会被其他线条打断。
- 为什么在互联网上交流变数如此困难?
- 线程的交叉执行
- 链接中的交叉执行应重新排序。
- 更新的共享变量值在工作内存和主内存之间的整个时间间隔中不会改变。
同步如何确保秩序?
- 共享变量的最新值必须更新到主内存,才能打开线索 。
- 当线索锁定时,工作内存中共享变量的值为空,因此当访问共享变量时,读取主内存中的最新值(注意:锁定与解锁相同)。
22. 交叉参照代码的线索执行程序是什么?
- 获得互斥锁
- 清空工作内存
- 将主内存复制更新到工作内存
- 执行代码
- 更新的共享变量值将刷新为主内存。
- 释放互斥锁
重新排列指示有什么价值?
命令重排序是编译器或处理器为提高程序速度而实施的优化。
24、为何要重新安排指示的顺序,以改进业绩?
通过减少对执行流的干扰,CPU处理性能得到改进。
25、重排序类别?
- 重新排列优化编译器( 压缩机优化) 文件 。
- 命令级别命令的平行重新排序(程序优化)
- 内存系统应重新排序(处理器优化)。
26、重排序规则?
下列概念管辖命令重排顺序:
- 程序性秩序的概念:线条中的语义同义词
- 波动规则规定,在阅读前写出波动变数,可确保波动变数的可见度。
- 锁定规则: 在进一步锁定前必须解锁 。
- 被动:A先于B,B先于C,然后A先于C。
- 在每次行动之前,他都称启动程序为线索。
- 线线活动之前 都有线线的终止
- 线线的中断在代码中断之前就已经发生。
- 对象的构造功能被执行,结尾前有
finalize()方法
变化无常如何能取得记忆能见度?
这是通过引入记忆屏障和禁止重新确定优先次序来实现的。
每次访问时,要从主内存中重写变量的值,需要变量变异变量来重写变量的值,而当变量修改时,线索被迫将最新值刷新到主内存。这样可以确保变量的最新值在任何一个时刻总是可见于多个线条中,每次访问时都要求组合多拉蒂尔变量从主内存中重写变量的值,当变量修改时,线索被迫将最新值刷新到主内存。这样可以确保变量的最新值在任何特定时间总是可见于不同的线条中。
什么是记录和档案管理屏障?
内存屏障是一种CPU指令,用于:(a) 强制执行某些操作的顺序;(b) 影响某些数据的可见度(这可能是执行某些指令的结果)。
它们通过保证另一CPU的屏障两侧的所有指示均按正确的顺序排列,从而保持了序列的外部可见性;第二,它们使存储数据的可见性与CPU缓存系统同步。
为什么记录和档案管理屏障在禁止指令重订顺序的同时确保能见度?
编译者和处理者可以与输出结果重新排序相同的方式重新排列指令,允许优化性别。 插入一个内存屏障, 相当于指示 CPU 和编译者必须先运行命令, 然后再执行命令 。 内存屏障的另一个用途是同时强迫多个CPU之间的缓存 。
在 Java 记忆模型中, 挥发性变量在写入操作后插入存储屏障, 在读取操作前插入负载屏障。 带有最终字段的类在初始化后插入存储屏障, 以保证当建设功能启动时最终字段是可见的和可用的 。
30, 如何调整执行业绩的顺序?
优化汇编器重排序:在不考虑结果的情况下优化执行顺序
指挥部一级的平行重新排序:将算术作业结合起来,以提高CPU核心的计算平行性和执行效率,可能会在过程中造成程序顺序上的不确定性。
内存系统重新排序:大多数处理器使用缓存加速速度,尽可能避免处理器在进入主内存方面花费的时间。
在这种模式下存在一个问题,即缓存中的数据没有与主内存中的数据实时同步,而CPU(或CPU核心)之间的缓存中的数据没有实时同步。这可能导致在同一时间点,CPU在同一内存地址所查看的数据值可能不一致。
31 CPU读缓存的优先级是什么?
内存、 保存器和高速缓存
相关新闻
- 2023-04-16 2台电脑怎么共享(2台电脑怎么共享
- 2023-04-16 主板检测卡代码(电脑主板检测卡代
- 2023-04-16 dnf未响应(dnf未响应老是上不去)
- 2023-04-16 ppoe(pppoe拨号上网)
- 2023-04-16 网速不稳定(网速不稳定是路由器的
- 2023-04-16 wds状态(Wds状态成功)
- 2023-04-16 光标键(光标键不动了怎么办)
- 2023-04-16 电脑提速(电脑提速100倍的方法)
- 2023-04-16 切换用户(切换用户怎么切换回来
- 2023-04-16 数据包是什么(产品数据包是什么
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
