JVM 内存、直接内存、系统内存、本地内存、物理内存总结
- [一、物理内存(Physical Memory)](#一、物理内存(Physical Memory))
- [二、本地内存(Native Memory)](#二、本地内存(Native Memory))
-
- 1.核心定义
- [2.核心组成(以 JVM 进程为例)](#2.核心组成(以 JVM 进程为例))
- 3.关键特性
- 4.与物理内存的关系
- [三、JVM 内存(JVM Managed Memory)](#三、JVM 内存(JVM Managed Memory))
- [四、直接内存(Direct Memory/Off-Heap Memory)](#四、直接内存(Direct Memory/Off-Heap Memory))
-
- 1.核心定义
- 2.核心用途
- 3.关键特性
- [4.与 JVM 内存的关系](#4.与 JVM 内存的关系)
- 5.回收逻辑(易踩坑点)
- [五、 系统内存(System Memory)](#五、 系统内存(System Memory))
- [六、 五者的层级关系(从底层到上层)](#六、 五者的层级关系(从底层到上层))
- [七、 总结](#七、 总结)
一、物理内存(Physical Memory)
最底层的硬件资源,是所有上层内存的最终载体。
1.核心定义
物理内存(也叫主存 / 内存条)是计算机硬件层面的存储介质。
计算机主板上安装的内存条,是 CPU 可以直接寻址的二进制存储单元(以字节为单位),容量由硬件决定(如 16G、64G)。
2.关键特性
- 硬件级资源:属于物理硬件,容量固定(如 16G、64G),断电后数据丢失。
- 速度层级:远快于磁盘(SSD/HDD),但慢于 CPU 缓存(L1/L2/L3)。
- 全局共享:被操作系统(OS)、所有运行的进程(JVM、数据库、浏览器等)共享。
3.管理主体
由操作系统内核通过内存管理单元(MMU)管控,负责内存地址映射、分配、回收,以及物理内存不足时的交换分区(Swap) 调度(将部分磁盘空间模拟为内存,性能会急剧下降)。
4.与其他内存的关系
物理内存是所有上层内存(本地内存、JVM 内存、直接内存、系统内存)的最终载体 ------ 所有内存数据最终都要加载到物理内存中才能被 CPU 执行,若物理内存不足,OS 会启用交换分区(Swap)(将部分磁盘空间模拟为内存),但性能会急剧下降。
二、本地内存(Native Memory)
操作系统为单个进程分配的内存空间 ,是物理内存的进程级抽象。
本地内存是操作系统层面对物理内存的抽象(进程可使用的内存空间)。
1.核心定义
当一个进程(如 JVM 进程)启动时,操作系统会为其分配一块独立的内存空间,这块空间就是该进程的本地内存。
本地内存(也叫操作系统内存 / 进程内存)是操作系统为单个进程分配的内存空间,是物理内存的 "进程级抽象"。64 位系统中,单个进程的本地内存理论上限是 2⁶⁴字节(实际受物理内存 / OS 限制),32 位系统仅 4G(默认 2G 给用户态,2G 给内核态)。
2.核心组成(以 JVM 进程为例)
JVM 进程的本地内存 = JVM 可管控的内存 + JVM 不可管控的系统内存
| 分类 | 具体包含 | 管理主体 |
|---|---|---|
| JVM 可管控的内存 | 1. JVM 标准内存区域(堆、虚拟机栈、元空间等)-JVM 内存(JVM 管控) 2. 直接内存(堆外内存,JVM 间接管控) | JVM 主导,OS 配合 |
| JVM 不可管控的系统内存 | 1. 进程内核态数据结构(PCB 进程控制块、TCB 线程控制块) 2. 系统资源占用(文件句柄、网络套接字、信号量) 3. 动态链接库(.so/.dll)加载的内存 | 操作系统完全管控 |
3.关键特性
- 进程隔离:不同进程的本地内存相互独立,一个进程崩溃不会影响其他进程的本地内存。
- 管理主体:核心由 OS 管理,JVM 仅能管控其中 "JVM 内存" 部分,直接内存需通过 JNI/Unsafe API 间接申请 / 释放;
- 溢出风险:本地内存耗尽时,OS 会触发 OOM Killer 直接杀死进程(即使 JVM 堆内存充足)。
4.与物理内存的关系
本地内存是物理内存的 "子集",但进程实际使用的本地内存可以超过物理内存(OS 通过 Swap 分区实现 "虚拟内存")。
三、JVM 内存(JVM Managed Memory)
JVM 内存是 JVM 进程从本地内存中划分的、由 JVM 自己通过内存管理机制(如 GC、栈帧管理)管控的内存区域(含堆、栈、元空间等),是 Java 程序员最常接触的内存范畴。
1.核心定义
JVM 启动时,会向操作系统申请一块本地内存,然后在这块内存中划分出符合《Java 虚拟机规范》的区域,用于存储 Java 程序运行时的数据,这部分就是JVM 内存。
2.标准划分(JDK8+)
JVM 内存分为线程私有区域 和线程共享区域 ,前者无需 GC,后者是 GC 的核心操作对象。

3.关键特性
- 管理主体:完全由 JVM 管控,如堆的 GC 回收、栈帧的入栈 / 出栈、元空间的类加载 / 卸载。
- 配置参数:可通过 JVM 参数精准限制大小
| 区域 | 核心配置参数 |
|---|---|
| 堆 | -Xms(初始堆)、-Xmx(最大堆) |
| 虚拟机栈 | -Xss(每个线程栈大小) |
| 元空间 | -XX:MetaspaceSize、-XX:MaxMetaspaceSize |
- 溢出类型:不同区域溢出表现不同(堆→OOM,栈→StackOverflowError,元空间→Metaspace OOM);
- 与本地内存的关系 :JVM 内存是本地内存的 "子集",JVM 启动时会向 OS 申请一块连续的本地内存作为 JVM 内存池,运行中根据配置动态调整(如堆扩容)。JVM 内存的大小直接影响本地内存的占用。
四、直接内存(Direct Memory/Off-Heap Memory)
JVM 通过 JNI/Unsafe API 直接向 OS 申请的==堆外内存== ,是 JVM 内存的**特殊补充**。
直接内存是 JVM 内存的 "特殊子集"(堆外内存),属于本地内存范畴,但由 JVM 间接管理。
1.核心定义
直接内存(也叫堆外内存 / Off-Heap Memory)不属于 JVM 标准内存区域(堆 / 栈 / 元空间),但属于 JVM 进程的本地内存,是 JVM 内存的 "特殊补充"。
2.核心用途
主要用于 Java NIO(New IO)提升性能,目的是解决传统 IO 的性能瓶颈:
- 传统 BIO 使用堆内存(HeapByteBuffer):读写数据时,数据需在「JVM 堆内存」和「OS 内核缓冲区」之间两次拷贝;
- NIO 使用直接内存(DirectByteBuffer):数据直接存储在直接内存,OS 可直接访问,仅需一次拷贝,大幅提升 IO 效率。
3.关键特性
| 对比维度 | 直接内存 | JVM 堆内存 |
|---|---|---|
| 归属层级 | 本地内存(堆外) | JVM 内存(堆内) |
| 管理主体 | JVM 间接管控(Cleaner虚引用 + Full GC),最终由OS 回收 | JVM 直接管控(Minor GC/Full GC 自动回收) |
| 配置参数 | -XX:MaxDirectMemorySize=size(默认等于-Xmx) | -Xms/-Xmx |
| 溢出提示 | OOM: Direct buffer memory | OOM: Java heap space |
| 回收机制 | 显式释放(Unsafe.freeMemory)或 GC(需触发 Full GC),Full GC 不触发时,直接内存可能长期占用本地内存 | Minor GC/Full GC 自动回收,无需手动干预 |
4.与 JVM 内存的关系
- 直接内存是JVM 内存的补充,而非替代;
- 直接内存的分配 / 释放需通过Unsafe API 或ByteBuffer的cleaner()方法,依赖 Full GC 触发回收(生产环境需注意配置-XX:MaxDirectMemorySize限制大小)。
5.回收逻辑(易踩坑点)
- 直接内存的回收依赖Cleaner(虚引用)+ Full GC:当 DirectByteBuffer 对象变为不可达时,Cleaner 会注册到 ReferenceQueue,Full GC 时触发Unsafe.freeMemory释放直接内存;
- 若 Full GC 不触发(如堆内存充足),直接内存可能一直占用本地内存,最终导致本地内存耗尽;
- 解决方案:
- 1.显式调用System.gc()(不推荐,会触发 Full GC);
- 2.手动通过Unsafe.freeMemory释放;
- 3.限制-XX:MaxDirectMemorySize,避免直接内存无上限占用。
五、 系统内存(System Memory)
操作系统自身和进程内核态占用的内存,是本地内存中 JVM 无法管控的部分。
1.核心定义
系统内存包含两部分:
- 操作系统内核自身占用的内存(如内核代码、进程调度数据、文件系统缓存);
- 进程的内核态内存(如 JVM 进程的 PCB、线程 TCB、文件句柄对应的内存)。
2.关键特性
- 完全由 OS 管控:JVM 无法读取或修改这部分内存;
- 占用比例小 :通常占物理内存的 5%~10%,但不可缺少;
- 与本地内存的关系 :系统内存是本地内存的子集,也是物理内存的子集。
六、 五者的层级关系(从底层到上层)
物理内存(硬件:内存条)
↓ OS抽象/分配
本地内存(进程级内存空间:JVM进程专属)
↓ 划分
├─ JVM可管控的内存
│ ├─ JVM内存(JVM管控:堆、栈、元空间等)
│ ↓ 特殊补充
│ └─ 直接内存(JVM间接管控:堆外内存,属于本地内存)
└─ 系统内存(OS管控:OS内核态内存、进程内核态内存,JVM不可管控)
七、 总结
| 内存类型 | 核心定位 | 管理主体 | 配置 / 限制方式 | 溢出风险 |
|---|---|---|---|---|
| 物理内存 | 底层硬件资源 | 操作系统内核 | 硬件更换 / 扩容 | 系统触发 Swap,性能暴跌 |
| 本地内存 | JVM 进程的内存空间 | OS + JVM | 受物理内存 / 容器限制 | OS 杀死 JVM 进程 |
| JVM 内存 | JVM 管控的核心内存 | JVM | Xms/-Xmx/-Xss等 | 堆 OOM、栈溢出、元空间 OOM |
| 直接内存 | JVM 堆外IO 优化内存 | JVM + OS | -XX:MaxDirectMemorySize | Direct buffer memory OOM |
| 系统内存 | OS 和进程内核态内存 | 操作系统 | 无(OS 自动管理) | 系统整体 OOM |