-
泛型(Generics)
总的来说,相比于协变数组,java 的泛型被设计为不可协变提供了很好的编译时类型检查。但是由于
类型擦除
导致了泛型存在很严重的type-safe
问题。 …
-
java对象头
在
HotSpot
虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)
,实例数据(Instance Data)
,对齐填充(Padding)
。 …
-
Mutexs and condition variable
我们在日常编程中使用并发机制主要解决以下两方面的问题: …
-
进程虚拟内存管理
我们知道, 进程有自己独立的虚拟地址空间, 在 64-bit linux 系统下,理论上最大寻址空间达到了 2^64。一个程序执行的并不是随便使用这么大的空间,而是涉及到程序的内存分配策率。从内存分配的角度来分,有static allocation
,automatic allocation
,dynamic allocation
。 从内存布局的角度大致分为:数据段,代码段,栈段,堆。 …
-
静态链接
我们知道,一个典型的程序写好之后,会经历如下几个过程最终成为可执行的程序:
编译
,汇编
,链接
。其中,编译和汇编都是以单个文件为单位独立进行的。 而链接是将各个目标文件组织在一起的过程。在源程序层面,各个文件之间是以符号(即变量名和函数名)相关联的,而在二进制的目标文件层面,各个目标文件以确定的地址相引用。链接过程就是分配程序的虚拟地址空间,并进行符号解析对符号的引用进行重定向。 …
-
不可变类
我们知道当多个线程对 共享可变 的
状态
进行不确定顺序的非原子操作时,那些在逻辑上为原子的非原子操作可能会导致数据出现不一致,即线程安全性问题。 …
-
重排序问题
在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。 …
-
Race Condition
首先: 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 …
-
jvm类加载机制
在Class文件中描述的各种信息最终要加载到虚拟机中之后才能运行和使用。类中被加载到虚拟机内存到卸载出内存,它的整个生命周期包括:
加载(Loading)
,验证(Verification)
,准备(Preparation)
,解析(Resolution)
,初始化(Initialization)
使用
和卸载(reload)
7个阶段。 …
-
方法调用
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法)。我们知道,
Class
文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class
文件里面储存的都只是符号引用,而不是方法在实际运行时的内存布局的入口地址。这使得在调用方法时,要等到类加载期间,甚至到运行期间才能确定目标方法的直接引用。 …