基础知识并发的问题饥饿当一个线程等待某个需要运行很长时间或永远无法完成的事件发生时,该线程就会陷人饥饿。为了避免线程陷入饥饿,我们可以为其设计一个等待超时的策略。
死锁两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。
产生条件
互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,...
Continue reading
运行期优化由于Java虚拟机规范没有具体的约束规则去限制即时编译器应该如何实现,所以这部分功能完全是与虚拟机具体实现
HotSpot虚拟机内的即时编译器解释器与编译器解释器与编译器两者各有优势:当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。当程序运行环境...
Continue reading
Continue reading
编译期优化Java语法糖泛型与类型擦除泛型的本质是参数化类型(Parametersized Type)。
C#有自己的虚方法表和类型数据,这种实现称为类型膨胀,基于这种方法实现的泛型称为 真实泛型 。
Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原來的原生类型(RawType,也称为裸类型)了,并且在相应的地方插入了强制转换代码。Java语者中的泛型实现...
Continue reading
Continue reading
垃圾收集器与内存分配策略概述程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭。因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。
Java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,...
Continue reading
Continue reading
Java内存区域与内存溢出异常Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。
运行时数据区域
程序计数器程序计数器(ProgramCounterRegister)是一块较小的内存空间,它可以看作是当前线程所执行的宇节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就...
Continue reading
Continue reading
类文件结构代码编译的结果从本地机器码转变为宇节码,是存储格式发展的一小步,却是编程语言发展的一大步。
语言无关性实现语言无关性的基础是虚拟机和字节码存储格式。
宇节码命令所能提供的语义描述能力比Java语言本身更加强大。
Class类文件的结构class文件是一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中...
Continue reading
Continue reading
虚拟机类加载机制概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动...
Continue reading
Continue reading
虚拟机字节码执行引擎在Java虚拟机规范中制定了虚拟机宇节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统一外观(Facade)。在不同的虚拟机实现里面,执行引擎在执行java代码的时候可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两者兼备,甚至还可能会包含几个不同级别的编译器执行引擎。
运行时栈帧结构栈帧(Stack Frame) 是用...
Continue reading
Continue reading
类加载及执行子系统的案例与实战字节码生成技术与动态代理的实现在Java里面除了javac和字节码类库外,使用字节码生成的例子还有很多,如Web服务器中的JSP编译器,编译时椬人的AOP框架,还有很常用的动态代理技术,甚至在使用反射的时候虚拟机都有可能会在运行时生成字节码来提高执行速度。
在Spring内部都是通过动态代理的方式来对Bean进行增强的。动态代理中所谓的“动态”,是针对使用Java代码...
Continue reading
Continue reading
Java内存模型与线程并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类“压榨”计算机运算能力的最有力武器。
概述并发场景
- 充分利用计算机处理器的能力
- 一个服务端同时对多个客户端提供服务
## 硬件的效率与一致性
物理计算机中的并发问题
基于髙速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也为计算机系统带来更高的复杂度,因为它引人了一...
Continue reading
Continue reading