概念#
本地内存 = 直接内存 + 元空间
直接内存#
- 概念:直接内存不是虚拟机运行时数据区的一部分,直接内存是在 Java 堆外地、直接向系统申请的内存区域。直接内存使用 NIO,通过存在堆中的 DirectByteBuffer 操作 Native 内存,所以读写性能高。
- 原因:直接内存是一块物理内存,专门用于 JVM 和 IO 设备打交道。因为 JVM 是基于自动垃圾回收机制运行的,所有内存中的数据会在 GC 时不停的被移动,如果你调用系统 API 告诉操作系统将内存某某位置的内存写入磁盘,而此时发生 GC 移动了该部分数据,GC 结束后操作系统是不是就写错数据了。
元空间#
- 概念:在 JDK1.8 开始才出现元空间的概念,之前叫方法区 / 永久代。存储被加载的类信息、常量、静态变量、常量池、即时编译后的代码等数据。
工作内存与本地内存#
JMM 中每一个线程都有一个自己的工作内存用于存储 jvm 内存中的共享变量,每一个线程只能对自己工作内存中的变量进行操作。工作内存是一个抽象的概念,不是真正的内存,而是 CPU 寄存器与缓存。