0%

概述

在Java技术下谈“编译期”而没有具体上下文语境的话,其实是一句很含糊的表述,因为它可能是指一个前端编译器(叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;

也可能是指Java虚拟机的即时编译器(常称JIT编译器,Just In Time Compiler)运行期把字节码转变成本地机器码的过程;

还可能是指使用静态的提前编译器(常称AOT编译器,Ahead Of Time Compiler)直接把程 序编译成与目标机器指令集相关的二进制代码的过程。

  • 前端编译器:JDK的Javac、Eclipse JDT中的增量式编译器(ECJ)
  • 即时编译器:HotSpot虚拟机的C1、C2编译器,Graal编译器。
  • 提前编译器:JDK的Jaotc、GNU Compiler for the Java(GCJ)、Excelsior JET

相当多新生的Java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖字节码或者Java虚拟机的底层改进来支持。

Java中即时编译器在运行期的优化过程,支撑了程序执行效率的不断提升;

前端编译器在编译期的优化过程,则是支撑着程序员的编码效率和语言使用者的幸福感的提高。

阅读全文 »

概述

执行引擎是Java虚拟机核心的组成部分之一。

“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。

在《Java虚拟机规范》中制定了Java虚拟机字节码执行引擎的概念模型,这个概念模型成为各大发 行商的Java虚拟机执行引擎的统一外观(Facade)。

阅读全文 »

无关性的基石

各种不同平台的Java虚拟机,以及所有平台都统一支持的程序存储格式——字节码(Byte Code) 是构成平台无关性的基石

在Java技术发展之初,设计者们就曾经考虑过并实现了让其他语言运行在Java虚拟机之上的可能性,他们在发布规范文档的时候,也刻意把Java的规范拆分成了《Java语言规范》(The Java Language Specification)及《Java虚拟机规范》 (The Java Virtual Machine Specification)两部分。

实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机 指令集、符号表以及若干其他辅助信息。

阅读全文 »

update的加锁流程

加锁规则总结

因为间隙锁在可重复读隔离级别下才有效,以下规则基于可重复读隔离级别。(RC级别下,去掉间隙锁这块逻辑就可以了)

  • 加锁的基本单位是next-key lock。next-key lock是前开后闭区间。
  • 查找过程中访问到的对象才会加锁。
  • 索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁。
  • 索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁。
  • 唯一索引上的范围查询会访问到不满足条件的第一个值为止。
阅读全文 »

CUP

多级缓存

为了解决计算机系统中主内存与 CPU 之间运行速度差问题,会在 CPU 与主内存之间添加一级或者多级高速缓冲存储器( Cache )。这个 Cache 一般是被集成到 CPU 内部的,所以也叫 CPU Cache。

阅读全文 »

CompletableFuture

从JDK 8开始,在Concurrent包中提供了一个强大的异步编程工具CompletableFuture。在JDK8之前,异步编程可以通过线程池和Future来实现,但功能还不够强大。CompletableFuture的出现,使Java的异步编程能力向前迈进了一大步。

CompletableFuture主要用处是将多个任务进行编排

阅读全文 »

写在最前面

设计模式其实并没有想象中的高大上,不必死记硬背,重点是结合自己的编码实践,思考背后的设计原则(开闭原则、单一职责原则等)。

设计模式在使用的时候,不是死板的一个一个模式套用,更多的是多个设计模式混合起来。最终的目的是写出解耦的、易扩展的、可读性好的代码。

设计模式说白了就是为某种代码的写法,提供一种通用语言,降低程序员沟通之间的成本。

阅读全文 »

七大软件架构设计原则

开闭原则

开闭原则(Open-Closed Principle,OCP)指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

所谓开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性及可维护性。开闭原则是面向对象设计中最基础的设计原则。它指导我们如何建立稳定灵活的系统,例如版本更新,我们尽可能不修改源码,但是可以增加新功能。

阅读全文 »