JVM 类加载机制

类的生命周期 通常类的声明周期包括以下 7 个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using) 卸载(Unloading) 其中解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。 类初...

JVM 垃圾收集 - 垃圾收集器

以上是 HotSpot 虚拟机中的 7 个垃圾收集器,连线表示垃圾收集器可以配合使用。 Serial 收集器 Serial 收集器是单线程的收集器,不仅意味着只会使用一个线程进行垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停所有其他工作线程,往往造成过长的等待时间。 它的优点是简单高效,对于单个 CPU 环境来说,由于没有线程交互的开销,因此拥有最高的单线程收集效率。 ...

JVM 垃圾收集 - 垃圾收集算法

JVM中,垃圾收集算法主要分为复制、标记清除、标记整理、分代收集几种: 标记-清除算法 将需要回收的对象进行标记,然后清除 不足: 标记和清除过程效率都不高 会产生大量碎片 之后的算法都是基于该算法进行改进。 复制算法 将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面,然后再把使用过的内存空间进行一次清理。 优...

JVM 垃圾收集 - 对象可回收判断

在 JVM 内存模型[1] 中, 程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。垃圾回收主要是针对 Java 堆和方法区进行。 引用计数 给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。当两个对象出现循环引用时,引用计数器永远...

JVM 内存模型

Jvm 内存模型主要包括程序计数器(寄存器)、虚拟机栈、本地方法栈、堆、方法区、运行常量池、直接内存几部分组成。 程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是 Native 方法则为空)。 当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址会被保存下来,以便用于被中断的线程恢复执行时再按照被中断时的指令地址继续执行下去。 为了线程切换后能恢复到...

设计模式 - 状态模式(State pattern)

定义 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 类型 对象行为模式 适用性 以下情况适用状态模式: 一个对象的状态取决于它的行为,并且它必须在运行时刻根据状态改变它的行为; 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态,这些状态通常由一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条...

设计模式 - 命令模式(Command pattern)

定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 类型 对象行为模式 适用性 以下情况适用命令模式: 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互; 系统需要在不同的时间指定请求、将请求排队和执行请求; 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作; 系统需...

设计模式 - 责任链模式(Chain-of-responsibility pattern)

定义 使多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 类型 对象行为模式 适用性 以下情况适用责任链模式: 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定; 想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求; 可处理一个请求的对象集合应该被动态制定...

设计模式 - 迭代器模式(Iterator)

定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。 类型 对象行为模式 适用性 以下情况适用模板方法模式: 访问一个聚合对象的内容而无需暴露它的内部表示; 支持对聚合对象的多种遍历; 为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代) 结构 参与者 迭代器(Iterator): 定义访问和遍历元素的接口; 具体迭代器(Co...

设计模式 - 观察者(Observer)

定义 定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 类型 对象行为模式 适用性 以下情况适用模板方法模式: 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这二者封装在独立的对象中以使他们可以各自独立地改变和复用。 当对一个对象的改变需要同步改变其他对象,而不知道具体有多少对象有待改变; 当一个对象必须...