Java线程池ThreadPoolExecutor
Executor框架
Executor 框架在JDK5之后引进,其不仅包括了线程池的管理,还提供了线程工厂、队列以及拒绝策略等,Executor 框架让并发编程变得更加简单。
框架三部分结构
任务(Runnable/Callable)
执行任务需要实现Runnable接口或Callable接口。这两个接口的实现类可以被Executor接口的实现类ThreadPoolExecutor或ScheduledThreadPoolExecutor执行。
任务的执行(Executor)
public class ThreadPoolExecutor extends AbstractExecutorService
public class ScheduledThreadPoolExe...
NIO
NIO也叫非阻塞IO,于Java1.4中引入, 可以看作是 I/O 多路复用模型
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间->用户空间)还是阻塞的。
IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。
Java 中的 NIO ,有一个非常重要的选择器 ( Selector ) 的概念,也可以被称为 多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后,才会为其服务。
NIO使用
其主要构成有三部分,Channels、Buffers、Selectors,下面挨个讲解
Channel...
反射机制
反射就是把Java类中的各个成分映射成一个个的Java对象,通常将反射与代理杰哥,构造新工具。
Java中主要由以下的类来实现Java反射机制
Class类:代表一个类。
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor类:代表类的构造方法。
Class类
获取Class对象
1.Class.forName("全类名"),将字节码文件加载仅内存,获取Class对象。通过将forName与newInstance配合使用,调用默认构造器初始化一个新的对象,如果该类没有默认构造器会抛出异常。但是目前newInstance方法已经是被JDK15标注为不推荐使用,它会在编译期跳过异常检查,推荐使用Co...
字节码执行引擎
运行时栈帧结构
对于执行引擎来说,在活动线程中,只有栈顶的方法在运行,因此也只有位于栈顶的栈帧才是生效的,也叫做当前栈帧。
局部变量表
用于存放方法参数和方法内部定义的局部变量,以变量槽为最小单位,在编译为Class文件后,在方法的Code属性的max_locals数据项确定了该方法的最大容量。局部变量表(非static)中第0个索引默认存储this,方法体中的拜年了超过其作用域后,其所占用的变量槽会被重用。
操作数栈
在方法的Code属性中max_stacks数据项中规定了操作数栈的最大深度。在方法的执行过程中, 会有各种字节码指令往操作数栈中写入和提取内容, 也就是出栈和入栈操作。
方法调用
解析
在类加载的解析阶段,会将一部分的符号引用转化为直接引用。调用不同...
字节码指令
Java虚拟机的指令由操作码和操作数构成,操作码长度为一个字节,因此总数不超过256条。不考虑异常操作下的执行模型
字节码与数据类型
大多数指令都包含操作所对应的数据类型,记录数据类型的字符叫做助记符:i代表对int类型, l代表long, s代表short, b代表byte, c代表char, f代表float, d代表double, a代表reference。
编译器会在编译期或运行期将byte和short类型的数据带符号扩展(Sign-Extend) 为相应的int类型数据, 将boolean和char类型数据零位扩展(Zero-Extend) 为相应的int类型数据。 与之类似, 在处理boolean、 byte、 short和char类型的数组时, 也会转换为使用对...
类加载
类加载的过程
一个类从加载到虚拟机内存到跌在出内存,拥有七个阶段:加载、验证、准备、解析、初始化、使用、卸载。
加载
加载阶段,虚拟机会完成三件事
通过类的全限定名获取二进制字节流
将字节流的静态存储结构转化为方法区的运行时数据结构
在内存中生成一个该类的java.lang.Class对象,作为方法区这个类的各种数据的方法入口
验证
包含四部分:文件格式验证、元数据验证、字节码验证和符号引用验证
文件格式验证:验证字节流是否复合Class文件格式的规范
元数据验证:对字节码描述的信息进行语义分析
字节码 验证:最复杂的阶段,对类的方法体进行校验,确定程序的语义是合法的,符合逻辑。
符号引用验证:对类自身意外的信息进行匹配性的验证。
...
类文件结构
Class类文件结构
Class文件格式采用两种数据类型:无符号数与表
无符号数:以u1、 u2、 u4、 u8来分别代表1个字节、 2个字节、 4个字节和8个字节的无符号数 ,可以用来描述数字、 索引引用、 数量值或者按照UTF-8编码构成字符串值。
表:由多个无符号数或者其他表构成的复合数据结构,习惯性以”_info”为后缀
上图是Class文件的数据项表格,其有着严格的规定。
魔数
每个Class文件的头四个字节被称为魔数,用于校验这个文件是否是一个能被虚拟机接受的Class文件,而并不以文件的后缀名校验。魔数值为0xCAFEBABE
Class文件版本
魔数后面的4个字节存储Class文件的版本号,前两个字节为次版本号,后两个字节为主版本号,版本号从45开始...
垃圾收集器
经典的垃圾收集器共有七款:
新生代垃圾收集器:Serial、ParNew、Parallel Scavenge
老年代垃圾收集器:CMS、Serial Old、Parallel Old
全堆垃圾收集器:G1
如果两个垃圾收集器之间存在连线,说明它们可以搭配着使用。
Serial收集器
serial收集器是最基础、历史最悠久的收集器,是新生代 收集器中的一种,是基于标记-复制算法实现的收集器,同时也是一个单线程工作的收集器,在进行垃圾收集的时候会停止其他线程工作,产生Stop The World。
尽管它会致使用户线程长时间停顿,但是它简单高效
对于内存资源受限的环境, 它是所有收集器里额外内存消耗最小的
对于单核处理器或处理器核心数较少的环境来说, Se...
共计 30 篇文章,4 页。