前言
记录一下一些内存管理的知识点,本文会不断更新...
something
Java 四种引用类型对比
| 引用类型 | 类名 | GC 行为 | 用途类比 | 何时被回收 |
|---|---|---|---|---|
| 强引用 | (默认) | 绝不回收 | 必需品 | 永远不回收,除非断开引用 (obj = null) |
| 软引用 | SoftReference |
内存不足时回收 | 缓存 | 内存不足,即将抛出 OutOfMemoryError 之前 |
| 弱引用 | WeakReference |
发现即回收 | 临时映射/监听器 | 只要发生 GC,无论内存是否充足,都会立即回收 |
| 虚引用 | PhantomReference |
随时回收 | 对象回收跟踪 | 随时可能被回收,无法通过它获取对象 |
Go与Java内存管理对比
| 特性 | Java | Go |
|---|---|---|
| 内存管理方式 | 基于可达性分析的垃圾回收,通过引用链判断对象是否存活 | 基于三色标记法的垃圾回收,追踪对象引用关系 |
| 引用类型 | 有 4 种明确的引用类型,让开发者参与内存管理决策 | 只有一种强引用,所有引用都是"强引用" |
| 哲学差异 | 给开发者更多控制权,但需要更复杂的理解 | 追求简单性,让 GC 自动管理一切,减少心智负担 |
Java引用场景对应Go方案
| Java 场景 | Go 推荐方案 |
|---|---|
| 软引用缓存 | 使用 go-cache 等带 TTL/LRU 的缓存库 |
| 弱引用映射 | 使用 sync.Map + 定期清理或事件驱动清理 |
| 监听器列表 | 使用 channel + context 模式 |
| 资源清理 | 实现 Close() 方法 + defer 语句 |
| 虚引用跟踪 | 使用结构化日志 + 监控指标,而非终结器 |