Java 直接内存 元空间
内存分类
- JVM内存:由 JVM 管理的内存区。包含:
- 堆
- 虚拟机栈。
- 程序计数器。
- 本地方法栈。
- 直接内存:由操作系统管理。包含:
- 直接内存。
- 元空间。
直接内存
直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。直接内存是在Java堆外的、直接向操作系统申请的内存区间。直接内存来源于NIO(Non-Blocking IO),可以通过ByteBuffer类操作。
访问直接内存的速度会优于Java堆,读写性能更高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。
元空间
不同版本JDK中方法区的实现是不一样的,JDK 7 使用永久代实现方法区,永久代中的数据还是使用JVM内存存储数据。而 JDK 8 使用元空间实现方法区,元空间中的数据放在了本地内存当中,直接内存和元空间一样都属于堆外内存。
直接内存异常
直接内存也可能导致OutOfMemoryError异常。由于直接内存在Java堆外,因此它的大小不会直接受限于“-Xmx”指定的最大堆大小,但是系统内存也是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。