对象
→ 返回 Java 基础
Java 里一切皆对象(除 8 种基本类型及其数组在语法上特殊外):类是模板(元数据在 Metaspace),实例是堆上的对象。本文是对象相关知识的总览与索引;细节以各专题文为准,避免多处重复展开。
文档分工(对象主题)
| 文档 | 负责什么 | 不负责什么 |
|---|
| 本文 · 对象 | 概念地图、学习路径、跨文档索引 | 不展开 GC 算法、不展开 JUC API 全集 |
| 面向对象 | 封装/继承/多态、Object 方法、equals/hashCode 写法 | 堆布局、GC、并发 |
| JVM | 堆上布局、创建五步、分配路径、Mark Word 字段 / lock bits | 锁升级、wait、JMM |
| 垃圾回收 | 存活判断、引用强度、晋升/回收、收集器 | 锁升级、happens-before |
| JMM | 多线程可见性/有序性、hb、安全发布 | 堆布局、锁升级实现 |
| JUC | synchronized、锁升级、wait/JUC 锁、sleep vs wait | Mark Word 位图、GC |
JVM 内存结构 ≠ JMM:前者管「对象在堆哪、怎么分配」;后者管「多线程能否看见彼此的写」。见 与 JVM「内存结构」的区别。
知识地图
┌────────────── 对象(本文)──────────────┐
│ 引用 · 创建 · 布局索引 · 生命周期索引 │
└────────────────────────────────────────┘
┌────────┼────────┬────────────┬────────────┐
▼ ▼ ▼ ▼ ▼
[[面向对象]] [[JVM]] [[垃圾回收]] [[JMM]] [[JUC]]
语言语义 堆·头·new 活/死·晋升 可见·发布 锁·wait
按问题找文档
| 你想搞懂… | 先看 |
|---|
引用、==、equals、多态 | 面向对象 |
new 之后内存里长什么样、对象头、Eden 分配 | JVM · JVM |
| 对象什么时候被回收、强软弱虚、为什么还占内存 | 垃圾回收 · 垃圾回收 |
| 为什么别的线程看不见我的修改、DCL 为何要 volatile | JMM |
synchronized 锁谁、wait 放不释放锁 | JUC · JUC |
| 偏向锁、轻量级锁、重量级锁怎么升级 | JUC |
| 单例半初始化、安全地把对象交给别的线程 | JMM · JUC |
引用与实例
| 概念 | 说明 |
|---|
| 引用 | 变量存地址;null 表示未指向任何实例 |
| 实例 | new 在堆上的对象(对象头 + 字段) |
| 类 | Metaspace 中的元数据;一个类 → 多个实例 |
Person a = new Person("Alice");
Person b = a; // 同一实例的两个引用
对象的创建
new 五步(权威在 JVM):类加载检查 → 分配内存 → 零值 → 设置对象头 → <init>。
堆上的内存布局(摘要)
权威说明:对象在堆上的内存布局 · 对象头(Mark Word)
对象实例
├── 对象头:Mark Word(哈希/GC 年龄/锁状态)+ Klass 指针
├── 实例数据
└── 对齐填充
锁与对象头:synchronized / wait 作用在具体实例(或 Class)上,锁状态记在 Mark Word。
锁升级(无锁→偏向→轻量→重量):锁升级(Lock Escalation)。
可见性(退出锁后别的线程能否看见写)由 synchronized 的 happens-before 保证,与「当前是轻量还是重量」是两层问题。
Object 类(摘要)
完整 API 与示例:Object 类核心方法
| 方法 | 一句话 |
|---|
equals / hashCode | 集合键、值相等契约 |
wait / notify | 条件协作,须已持有该对象锁 → JUC |
clone | 浅拷贝 |
finalize | 已废弃 |
生命周期与 GC(摘要)
权威说明:对象存活判断 · 对象晋升与老年代
new → Eden(TLAB)→ Minor GC → Survivor(年龄+1)→ 达阈值 → 老年代 → 不可达 → 回收
- 活着:从 GC Roots 可达(含被
synchronized 持有的对象,见 对象存活判断)
- 引用强度:强 / 软 / 弱 / 虚 → 引用类型
- finalize:勿用;见 GC 文两次标记说明
拷贝
| 方式 | 行为 |
|---|
b = a | 只多一个引用 |
clone() | 浅拷贝 |
| 序列化 / 拷贝构造 | 深拷贝 → 序列化 |
线程与对象(摘要)
| 场景 | 要点 | 主文档 |
|---|
synchronized(obj) | 锁 obj 实例 | JUC |
sleep | 不释放锁 | JUC |
wait | 释放 Monitor | 同上 + JMM |
volatile 字段 | 可见性,不保证 i++ | JMM · JUC |
| 安全发布 | 别让别的线程看到半初始化对象 | JMM |
ThreadLocal | 线程池要 remove | JUC |
易混概念
| 概念 | 区别 |
|---|
| 基本类型 vs 包装类 | int 非对象;Integer 是对象 |
| Class 对象 | 类元数据的镜像,≠ 普通业务实例 |
| Metaspace | 类元数据;堆才是实例 → JVM |
String 常量池 | 字面量可能复用;new String 仍新建实例 |
推荐学习顺序
- 面向对象 — 会用对象与
Object API
- JVM — 实例在堆上如何创建与布局
- 垃圾回收 — 实例何时被回收
- JMM → JUC — 多线程下的对象状态与锁(先规范后 API)
- 反射 · 序列化 · 类加载 — 扩展
相关链接