# 计算机硬件的效率与一致性 现代计算机通过加入读写速度尽可能接近处理器运算器运算速度的高速缓存(Cache)用于运算过程。 缓存一致性 共享内存多核系统中多个处理器的运算任务涉及到同一块主内存区域,将可能导致各自的缓存数据不一致。 缓存一致性协议:要求处理器在访问缓存时遵循协议(MSI、MESI、MOSI、Synapse、 Firefly 及 Dragon Protocol 等)。 乱序执行优化:为使处理器运算单元尽量被充分利用,处理器对输入代码乱序执行优化,并对执行结果重组保证结果与顺序执行结果一致。 # Java 内存模型 Java...

在使用 html 中 audio 标签给页面加背景音乐时,使用以下代码: <audio id="backGround" autoplay ="autoplay" loop="loop" preload ="auto" src ="music/background.mp3">你的浏览器不支持audio标签</audio>用 chorme 打开页面加载完成后没有自动播放,移动端需做页面交互后才可播放没有达到想要的效果。 通过百度后,找到三种解决方法: #...

在使用 git 提交代码时,遇到以下错误提示 remote: error: unable to unlink old 'fancybox/jquery.fancybox.js': Permission...通过回顾操作,发现是由于操作不规范造成的服务器上 git 仓库内文件紊乱。使用以下命令解决(其中 website 是项目名称,重新赋予 git 用户 website 文件夹的权限) chown -R git:git website参考: (https://www.cnblogs.com/lxwphp/p/9771899.html)

后端编译:把 Class 文件转换成与本地基础设施(硬件指令集、 操作系统) 相关的二进制机器码的过程。 # 即时编译器 即时编译器 热点代码:在 java 程序通过解释器进行解释执行时,当某个方法或代码块运行特别频繁就认定这些为热点代码。 即时编译器:完成虚拟机将热点代码编译成本地机器码并优化的过程。 # 解释器与编译器 解释器与编译器各自优势 解释器:当程序需要迅速启动和执行时,使用解释器省区编译时间立即运行。 编译器:程序启动后编译器逐步将更多的代码编译成本地代码,减少解释器中间损耗,提高执行效率。 HotSpot虚拟机内置即时编译器 C1 编译器:客户端编译器 C2...

3种常见的编译过程 前端编译器 把 *.java 文件转变成 *.class 文件 JDK 的 Javac、 Eclipse JDT 中的增量式编译器(ECJ) 即时编译器 运行期把字节码转变成本地机器码 HotSpot 虚拟机的 C1、 C2 编译器, Graal 编译器 提前编译器 把程序编译成与目标机器指令集相关的二进制代码 JDK 的 Jaotc、 GNU Compiler for the Java(GCJ)、 Excelsior...

# Tomcat:正统的类加载器架构 健全的web服务器应解决的问题 同一个服务器上的两个 web 应用程序所使用的 Java 类库可以实现相互隔离。 同一个服务器上的两个 web 应用程序所使用的 Java 类库可以互相共享。 服务器尽可能地保证自身的安全不受部署的 web 应用程序影响。 支持 HotSwap 功能实现对 JSP 应用的支持。 Tomcat 目录结构 放置在 /common 目录中。 类库可被 Tomcat 和所有的 Web 应用程序共同使用。 放置在 /server 目录中。 类库可被 Tomcat 使用, 对所有的 Web 应用程序都不可见。 放置在...

# 概述 执行引擎通常分为解释执行(通过解释器)和编译执行(通过即时编译器产生本地代码)。 从外观上看所有 Java 虚拟机执行引擎输入输出都是一致的: 输入的是字节码二进制流 处理过程是字节码解析执行的等效过程 输出的是执行结果 # 运行时栈帧结构 每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。 每一个栈帧包括了局部变量表、 操作数栈、 动态连接、 方法返回地址和一些额外的附加信息。 编译 java 程序源码时,局部变量表的大小、操作数栈的深度都已被分析计算并写入到方法表 Code 属性中(max_locals 和...

# 概述 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、 转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。 类型的加载、 连接和初始化过程都是在程序运行期间完成的。 # 类加载的时机 类的生命周期 加载、 验证、 准备、 初始化和卸载这 5 个阶段的顺序是固定的,类的加载过程必须按照这种顺序按部就班地开始。(这些阶段通常都是互相交叉地混合式进行的,通常会在一个阶段执行的过程中调用、 激活另外一个阶段。) 为了支持 Java...

Java 虚拟机的指令由一个字节长度的、 代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。如果要将一个 16 位长度的无符号整数使用两个无符号字节存储起来(将它们命名为 byte1 和 byte2),那它们的值应该是这样的:(byte1<<8)|byte2 不考虑异常处理情况下,虚拟机解释器执行模型伪代码: do{ 自动计算 PC 寄存器的值加 1; 根据 PC...

# Class 文件格式(定义) 任何一个 Class 文件都对应着唯一一个类或接口的定义信息(但并不一定以磁盘文件的形式存在。譬如通过类加载器直接生成类或接口)。 Class 文件是一组以 8 位字节为基础单位的二进制流其中各个数据项目严格按照顺序紧凑地排列(没有任何分隔符)。 当遇到需要占用 8 位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个 8 位字节进行存储。 使用伪结构存储数据:无符号数(以 u1、 u2、 u4、 u8 来分别代表 1 个字节、 2 个字节、 4 个字节和 8...