1. 泛型(Generics)

    总的来说,相比于协变数组,java 的泛型被设计为不可协变提供了很好的编译时类型检查。但是由于 类型擦除 导致了泛型存在很严重的 type-safe 问题。 …


  2. java对象头

    HotSpot 虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header), 实例数据(Instance Data)对齐填充(Padding)。 …


  3. Mutexs and condition variable

    我们在日常编程中使用并发机制主要解决以下两方面的问题: …


  4. 进程虚拟内存管理


    我们知道, 进程有自己独立的虚拟地址空间, 在 64-bit linux 系统下,理论上最大寻址空间达到了 2^64。一个程序执行的并不是随便使用这么大的空间,而是涉及到程序的内存分配策率。从内存分配的角度来分,有 static allocation, automatic allocation, dynamic allocation。 从内存布局的角度大致分为:数据段,代码段,栈段,堆。 …


  5. 静态链接

    我们知道,一个典型的程序写好之后,会经历如下几个过程最终成为可执行的程序: 编译汇编链接。其中,编译和汇编都是以单个文件为单位独立进行的。 而链接是将各个目标文件组织在一起的过程。在源程序层面,各个文件之间是以符号(即变量名和函数名)相关联的,而在二进制的目标文件层面,各个目标文件以确定的地址相引用。链接过程就是分配程序的虚拟地址空间,并进行符号解析对符号的引用进行重定向。 …


  6. 不可变类

    我们知道当多个线程对 共享可变状态 进行不确定顺序的非原子操作时,那些在逻辑上为原子的非原子操作可能会导致数据出现不一致,即线程安全性问题。 …


  7. 重排序问题

    在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。 …


  8. Race Condition

    首先: 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 …


  9. jvm类加载机制

    在Class文件中描述的各种信息最终要加载到虚拟机中之后才能运行和使用。类中被加载到虚拟机内存到卸载出内存,它的整个生命周期包括:加载(Loading)验证(Verification)准备(Preparation)解析(Resolution)初始化(Initialization) 使用卸载(reload) 7个阶段。 …


  10. 方法调用

    方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法)。我们知道,Class 文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在 Class 文件里面储存的都只是符号引用,而不是方法在实际运行时的内存布局的入口地址。这使得在调用方法时,要等到类加载期间,甚至到运行期间才能确定目标方法的直接引用。 …