主页

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...

阅读更多