首页
关于
留言
归档
动态
友链
推荐
虫洞
开往
憶夣
累计撰写
57
篇文章
累计创建
11
个标签
累计收到
2
条评论
栏目
首页
关于
留言
归档
动态
友链
推荐
虫洞
开往
目 录
CONTENT
深入理解Java虚拟机-憶夣
以下是
深入理解Java虚拟机
相关的文章
2023-04-04
13、线程安全与锁优化
## 摘要 本文系统介绍了Java中线程安全与锁优化的核心概念。首先,将线程安全按严格程度分为五类:**不可变**(最安全的纯线程安全)、**绝对线程安全**(极少见,如Vector仍需外部同步)、**相对线程安全**(单次操作安全,大多数线程安全类属此类)、**线程兼容**(需调用方加同步,如ArrayList)和**线程对立**(多线程下无法安全使用,已被废弃)。 线程安全的主要实现手段包括:**互斥同步**(synchronized和ReentrantLock,属于悲观策略,存在用户态/内核态切换开销)、**非阻塞同步**(基于CAS等硬件原子指令的乐观策略)以及**无需同步**(可重入代码和ThreadLocal线程本地存储)。 在锁优化方面,JDK 1.6引入了多项技术:**自适应自旋锁**(动态调整自旋时间)、**锁消除**(基于逃逸分析去除不必要同步)、**锁粗化**(合并同一对象的多次加锁)、**轻量级锁**(无竞争时用CAS替代操作系统互斥量)和**偏向锁**(无竞争时完全消除同步操作)。这些优化形成了"偏向锁→轻量级锁→重量级锁"的渐进式升级机制,在保证正确性的前提下显著提升了并发性能。
2023-04-04
61
0
0
Java
2023-04-04
12、Java 内存模型与线程
## 摘要 本章围绕**Java内存模型(JMM)**与**线程机制**展开,核心内容涵盖以下几方面: **1. 硬件背景**:由于处理器与内存速度差异巨大,现代计算机引入高速缓存,但也引入了缓存一致性问题;处理器和JIT编译器还可能进行指令重排序优化。 **2. Java内存模型**:JMM将变量存储在主内存中,每条线程拥有工作内存(主内存副本),线程间通过主内存交互。定义了lock、unlock、read、load、use、assign、store、write共8种原子操作及相应规则,规范了内存访问行为。 **3. volatile关键字**:具备两大语义——保证变量对所有线程的**可见性**和**禁止指令重排序**,但并不保证复合操作的原子性。此外,long/double非原子性协定在实际中几乎不影响开发。 **4. 并发三大特性**:**原子性**(基本读写原子,更大范围靠synchronized)、**可见性**(volatile、synchronized、final)、**有序性**(volatile和synchronized保证)。**先行发生原则**提供了判断操作顺序的规则,是衡量并发安全性的依据。 **5. 线程实现与调度**:Java线程在JDK 1.2后映射为操作系统原生线程(一对一模型),采用**抢占式调度**,可通过优先级"建议"调度但最终由OS决定。线程有新建、运行、无限期等待、限期等待、阻塞、终止六种状态及转换关系。 总之,本章从底层原理出发,系统阐述了JMM如何保证并发安全,以及Java线程的实现机制,为编写高效并发程序奠定了理论基础。
2023-04-04
75
0
0
Java
2023-04-04
11、晚期(运行期)优化
## 摘要 本章介绍了JVM运行期(晚期)优化的核心机制——即时编译(JIT)。Java程序初始由解释器执行,当虚拟机探测到频繁执行的"热点代码"时,会将其编译为本地机器码以提升效率。 **热点探测**采用基于计数器的方式,通过方法调用计数器和回边计数器分别统计方法调用次数与循环体执行次数,超过阈值则触发编译。 **编译架构**上,HotSpot内置Client编译器(C1,注重编译速度)和Server编译器(C2,注重优化质量),并通过分层编译策略协同工作,在启动速度与执行效率间取得平衡。 **关键优化技术**包括:方法内联(最重要的优化,为其他优化奠定基础)、公共子表达式消除、数组边界检查消除,以及前沿的逃逸分析(据此可实现栈上分配、同步消除和标量替换)。 最后,本章对比了JIT与C/C++静态编译器的优劣:JIT受限于编译时间、动态类型安全和虚方法多态等,但得益于运行期性能监控信息,可进行激进优化,在动态性方面具有独特优势。
2023-04-04
52
0
0
Java
2023-04-04
10、早期(编译期)优化
## 第十章 早期(编译期)优化 — 摘要 本章系统讲解了 Java 前端编译器(以 Javac 为代表)的编译过程及 Java 语法糖的原理。 **Javac 编译流程**分为三大阶段:①**解析与填充符号表**:通过词法分析将源码字符流转为 Token,再经语法分析构建抽象语法树(AST),最后由 `Enter` 类填充符号表以登记符号地址与信息。②**插入式注解处理**:基于 JSR-269 规范,在编译期间可读取或修改 AST,若语法树被改动则重新循环处理,直至无修改为止。③**语义分析与字节码生成**:包含标注检查(如常量折叠)、数据与控制流分析、解语法糖(将泛型、自动装箱等还原为基础语法)以及最终由 `ClassWriter` 生成 `.class` 文件,同时完成 `<init>` 和 `<clinit>` 方法的收敛。 **语法糖**部分重点分析了泛型的类型擦除机制——运行时泛型信息被擦除,但元数据(如 `Signature` 属性)仍保留泛型签名,支持反射获取;自动装箱存在 `IntegerCache` 缓存陷阱(-128~127 范围内相同值对象相同);条件编译通过常量 `if` 语句实现,仅限于语句块级别。 **实战**部分演示了编写插入式注解处理器,在编译期自动检查类、方法、字段的命名规范。 > **核心观点**:Javac 作为前端编译器,主要目标是提升编码效率与语法便利性;而真正影响运行性能的是虚拟机内置的后端即时编译器(JIT),它将字节码编译为本地机器码,是衡量 JVM 性能的关键指标。
2023-04-04
57
0
0
Java
2023-04-04
9、类加载及执行于系统的案例与实战
## 摘要 本文主要介绍了Java虚拟机中**类加载器架构**的两大典型案例及**字节码生成技术**的实际应用。 **1. Tomcat的正统类加载器架构**:为满足Web应用的类库隔离、共享、安全及JSP热部署需求,Tomcat自定义了多个类加载器(Common、Catalina、Shared、WebApp、Jsp),采用双亲委派模型,通过不同目录结构实现访问范围的精细控制。 **2. OSGi的灵活类加载器架构**:每个Bundle可声明导入导出包,加载器之间无固定委派关系,形成运行时确定的网状结构,实现模块级热插拔和精确的可见性控制,但也引入了死锁等风险。 **3. 字节码生成与动态代理**:Spring利用动态代理实现Bean增强,可在运行时动态生成代理类,无需预先编写代理代码,实现灵活的方法拦截。 **4. Retrotranslator跨越JDK版本**:通过ASM框架处理字节码,将JDK 1.5编译产物转换为可在1.4/1.3上运行的版本,主要模拟编译器改进和API增强两类新功能。
2023-04-04
51
0
0
Java
2023-04-04
8、虚拟机字节码执行引擎
## 第八章 虚拟机字节码执行引擎 —— 摘要 本章系统讲解了Java虚拟机执行引擎的核心机制,主要涵盖四大部分: **执行引擎概述**:执行引擎是JVM最核心的组件,以字节码为输入、执行结果为输出,可选择解释执行、编译执行(JIT)或二者兼备。 **运行时栈帧结构**:栈帧是方法调用与执行的基本单位,包含局部变量表(以Slot为单位存储变量,Slot可复用)、操作数栈(后进先出)、动态连接(符号引用到直接引用的转换)和方法返回地址(正常退出与异常退出两种方式)。 **方法调用机制**:分为解析(编译期确定,适用于非虚方法如静态方法、私有方法、final方法)和分派两大类。分派包括静态分派(依赖静态类型,对应方法重载)、动态分派(依赖实际类型,对应方法重写,通过虚方法表优化性能)。Java是"静态多分派、动态单分派"语言。JDK 7通过`invokedynamic`指令和`java.lang.invoke`包提供了动态类型语言支持,使方法分派规则可由用户代码控制。 **基于栈的指令集**:JVM采用基于栈的指令集,优点是可移植性强、代码紧凑,缺点是执行速度相对基于寄存器的指令集较慢,可通过栈顶缓存等优化手段缓解。 总而言之,本章揭示了JVM从定位目标方法到执行字节码的完整过程及其底层内存结构。
2023-04-04
66
0
0
Java
2023-04-04
7、虚拟机类加裁机制
## 摘要 本文系统介绍了Java虚拟机的类加载机制,涵盖类加载的全生命周期、各阶段详细过程及类加载器体系。 类从被加载到卸载经历**加载、连接(验证、准备、解析)、初始化、使用和卸载**七个阶段,其中初始化仅在遇到`new`、访问静态字段、调用静态方法、反射调用、初始化子类及指定主类等五种场景下触发。 - **加载**:通过全限定名获取二进制字节流,转化为方法区运行时数据结构,生成`Class`对象。字节流来源多样(ZIP、网络、动态生成等),非数组类的加载开发者可通过自定义类加载器控制。 - **验证**:包括文件格式、元数据、字节码和符号引用四方面校验,确保Class文件安全合规。 - **准备**:为静态变量分配内存并设零值,但`final static`常量会直接赋指定值。 - **解析**:将常量池中的符号引用替换为直接引用,支持运行时动态绑定。 - **初始化**:执行类构造器`<clinit>()`,合并静态变量赋值和静态代码块,虚拟机保证线程安全且父类先于子类初始化。 类加载器方面,**类与加载器共同确定类的唯一性**。Java采用**双亲委派模型**,加载请求自底向上委派至启动类加载器,保证核心类(如`Object`)的一致性。该模型曾因历史原因、SPI机制及热部署需求(如OSGi)而被"破坏",分别通过重写`loadClass`、线程上下文类加载器和网状类加载结构来解决。
2023-04-04
72
0
0
Java
2023-04-04
6、类文件结构
# 第六章 Class文件结构 摘要 本章系统讲解了Java虚拟机的Class文件格式——Java技术体系实现平台无关性和语言无关性的核心基础。 **Class文件**是以8位字节为单位的二进制流,整体结构严格有序且不可变更,采用无符号数(u1/u2/u4/u8)和表两种数据类型组织数据。文件依次包含:**魔数**(0xCAFEBABE)、**版本号**、**常量池**(存放字面量与符号引用)、**访问标志**、**类/父类/接口索引**、**字段表集合**、**方法表集合**及**属性表集合**。其中属性表是最具扩展性的部分,涵盖Code(存储字节码)、Exceptions、LineNumberTable、LocalVariableTable、SourceFile、Signature(泛型信息)、BootstrapMethods等21项预定义属性。 **字节码指令集**以单字节操作码为核心,特点是代码紧凑但牺牲了部分执行性能。指令涵盖加载存储、算术运算、类型转换、对象操作、栈管理、控制转移、方法调用(invokevirtual/invokestatic/invokedynamic等)、异常处理(athrow+异常表)及同步(monitorenter/monitorexit)等类别,大多数指令与具体数据类型关联。 Class文件格式设计上兼顾**稳定性和可扩展性**——主体结构保持不变,新特性通过属性表和访问标志扩展。虚拟机实现方式灵活(解释执行、翻译为其他指令集或JIT编译),公有规范与私有实现分离,共同支撑了Java跨平台运行的基石。
2023-04-04
63
0
0
Java
2023-04-04
5、调优案例分析与实战
本章通过实际案例与实战,旨在提升读者JVM故障处理与调优经验。核心内容总结如下: 1. **高性能硬件部署策略**:对比了64位JDK大内存方案(存在GC停顿长、性能偏低、溢出难排查等劣势)与32位JVM逻辑集群方案(存在磁盘IO竞争、连接池效率低、单节点内存受限及本地缓存冗余等问题),强调需根据系统对停顿的敏感度慎重选择。 2. **典型故障案例分析**:剖析了集群缓存频繁写同步导致内存溢出、堆外内存(如Direct Memory、线程栈、Socket缓冲区等)耗尽引发的异常,以及不当数据结构、外部命令、虚拟内存等导致的系统缓慢或崩溃问题。 3. **实战调优**:以Eclipse运行速度调优为例,展示了具体的性能优化过程。 全文重在培养解决实际内存与性能瓶颈的实战思维。
2023-04-04
46
0
0
Java
2023-04-04
4、章虚拟机性能监控与故障处理王具
**摘要:** 本章系统介绍了JVM性能监控与故障处理的核心工具体系,旨在帮助开发者借助运行日志、堆栈信息、GC日志等数据,配合工具快速定位和解决问题。 **命令行工具方面**,重点讲解了七个JDK自带工具:**jps**查看虚拟机进程状态;**jstat**监视类装载、内存、GC及JIT编译等运行数据;**jinfo**实时查看和调整虚拟机参数;**jmap**生成堆转储快照并查询堆和永久代详细信息;**jhat**分析堆转储文件(提供浏览器查看);**jstack**生成线程快照,用于定位死锁、死循环等线程停顿问题;**HSDIS**反汇编JIT生成的本地代码。 **可视化工具方面**,介绍了两个JDK正式成员:**JConsole**基于JMX,提供内存和线程的可视化监控与管理功能;**VisualVM**则集多项功能于一身,覆盖进程信息展示、CPU/GC/堆/线程监视、堆转储分析、方法级性能剖析及离线快照等,并支持插件扩展,是功能最为强大的故障诊断工具。 **核心主题:** JVM监控工具体系(命令行+可视化)→ 运行数据采集与分析 → 性能瓶颈与故障定位。
2023-04-04
134
0
0
Java
1
2