线程安全与锁优化 线程安全与锁优化锁可以用来保证线程安全,线程安全却未必一定需要锁。 线程安全简单来说:如果多线程访问一个对象时,无需进行额外的同步或协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。 Brian Goetz(Java 并发编程实战的作者)将 Java 语言中各种操作共享的数据分为以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。 不可变如果一个对象是 f 2026-05-26 经典图书 > 深入理解Java虚拟机 #Java #并发
Java内存模型与线程模型 Java内存模型与线程模型在现代的多核架构机器中,每颗 cpu 都有自己的高速缓存,它们又共享主内存的数据,因此多 cpu 并发时需要处理缓存一致性(Cache Coherence)的问题,例如多处理器都写回时以谁的为准。为了解决这个问题,各个处理器访问缓存时都会遵循一些协议,在读写时要根据协议来进行操作,这类协议有 MSI、MESI(Illinois Protocol)、MOSI、 Synaps 2026-05-25 经典图书 > 深入理解Java虚拟机 #Java #Happens-Before #并发
JVM编译体系 JVM编译体系 从计算机程序出现的第一天起,对效率的追逐就是程序员天生的坚定信仰,这个过程犹如一场没有终点、永不停歇的 F1 方程式竞赛,程序员是车手,技术平台则是在赛道上飞驰的赛车。 Java 程序到执行一般要经过两个步骤,一个步骤是指从 .java 变为 .class 文件的过程,另一个是运行期把字节码转变成本地机器码的过程。随着提前编译器(AOT,Ahead Of Time Compile 2026-05-24 经典图书 > 深入理解Java虚拟机 #JVM #编译 #Java
类加载与双亲委派机制 类加载与双亲委派机制Java 在刚刚诞生之时曾经提出过一个非常著名的宣传口号“一次编写,到处运行 (Write Once,Run Anywhere)。为了实现这个口号,各种不同平台的 Java 虚拟机,以及所有平台都支持一种程序存储格式—字节码(Byte Code)。 需要指出的一点是:商业企业和开源机构已经在 Java 语言之外发展出一大批运行在 Java 虚拟机之上的语言,如 Kotlin、C 2026-05-23 经典图书 > 深入理解Java虚拟机 #JVM #Java
增量更新与原始快照 增量更新与原始快照Java 语言的垃圾回收一直有一个为人所诟病的点,即垃圾回收时会触发 “STW”,为了减少 “STW” 的时间,垃圾收集器也在不断改进。 在日常开发中,我们经常会通过多线程的手段缩短程序的执行时间,目前主流的垃圾收集器也使用了并发在某些阶段让 GC线程 和 用户线程 可以同时工作,以尽可能及时地对请求进行处理。 提到并发,那就一定会涉及线程安全问题。试想:如果一个扫地机器人(GC 2026-05-22 经典图书 > 深入理解Java虚拟机 #JVM #垃圾回收
垃圾收集器 垃圾收集器收集算法是内存回收的方法论,而垃圾收集器是内存回收的实践者。 JDK8 时,默认收集器组合是(Parallel Scavenge + Parallel Old),JDK 9 之后,(Serial,CMS) 以及(ParNew,Serial Old)的组合已经被废弃了,默认收集器也变成了 G1。 垃圾回收就像打扫房间一样,当你在打扫房间的时候同时又在制造垃圾,那么房间很难打扫干净,因此 2026-05-21 经典图书 > 深入理解Java虚拟机 #JVM #垃圾回收
垃圾回收方法论 垃圾回收方法论垃圾收集(Garbage Collect)也就是常说的 GC,GC 这个概念不是 Java 独有的,在 Java 之前已经有其他语言有 GC 的理念了,1960 年诞生于麻省理工学院的 Lisp 是第一门开始使用内存动态分配和垃圾收集技术的语言。 垃圾收集需要考虑以下这些事情: 回收什么区域的内存? 如何判断内存可回收? 怎么回收? 回收什么区域的内存Java 的内存区域被分为程 2026-05-20 经典图书 > 深入理解Java虚拟机 #JVM #垃圾回收
Java Object Java对象Java 是一门面向对象的编程语言,Java 程序运行过程中无时无刻都有对象被创建出来。 对象的组成在 HotSpot 虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:**对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)**。 对象头中存储的是与对象自身定义的数据无关的信息,包括:对象自身运行时数据和类型指针两部分。 对象运行时数据如哈希 2026-05-19 经典图书 > 深入理解Java虚拟机 #JVM #Java
JVM Structure JVM 内存结构Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规范》的规定,Java 虚拟机所管理的内存将会包括以下几个运行时数据区域: 程序计数器在 Java 虚拟机的概念模型里,程序计数器存的是下一条需要执行的字节码指令的地址,由于 Java 的多线程是通过分配处理器执行时间的方式来实现,所以为了在切换线程时保留执行状态(执行 2026-05-18 经典图书 > 深入理解Java虚拟机 #JVM
设计模式中的经典设计原则 设计模式中的经典设计原则设计模式中有一些经典的设计原则,包括:SOLID、KISS、YAGNI、DRY、LOD 等。 其中 SOLID 分别对应 单一职责原则、开闭原则、里式替换原则、接口隔离原则 和 依赖反转原则。 单一职责原则Single Responsibility Principle:A class or module should have a single reponsibility, 2026-05-17 设计模式 #设计模式