堆外、本机堆、直接内存和本机内存之间有什么区别?
What is the difference between off-heap, native heap, direct memory and native memory?
最近我在学习 JVM 内部原理时遇到了这些概念。我知道 SO 上已经有很多关于它们的问题,但我仍然无法理解它们之间的关系,或者它们是什么。
现在我这样描述它们:
本机内存 表示正常 JVM 堆之外的内存区域,但仍在 OS 节省的总用户 space 内存范围内对于 JVM 进程(例如在 32 位 Windows 上默认为 2 GB)。这个space是JVM保留的,用来存放一些内部数据,比如Permanent Generation/Method Area等
直接内存表示您通过java.nio.DirectByteBuffer
.
使用本机内存
本机堆 意味着您通过 unsafe.allocateMemory
使用本机内存,或者只是在您的 JNI 代码中执行 malloc
。
堆外与本机内存相同。
还有一个问题,是否可以直接在为 JVM 进程备用的总内存 space(32 位上为 4GB OS)之外分配内存?
请指出我理解中的错误,如果可能的话,请描述清楚。
1) 堆内存:JVM 进程中用于保存 Java 对象并由 JVM 垃圾收集器维护的内存。
2) Native memory/Off-heap: 是在进程地址 space 内分配的内存,它不在堆内,因此不会被释放Java 垃圾收集器。
3) Direct memory: 类似于native,但也意味着共享硬件中的底层缓冲区。例如,网络适配器或图形显示器中的缓冲区。这里的目标是减少相同字节在内存中被复制的次数。
最后,根据 OS 然后额外的本机分配(分配内存地址 space)可以通过不安全分配 and/or 通过内存映射文件来执行。内存映射一个文件特别有趣,因为它可以很容易地分配比机器当前作为物理内存更多的内存。另请注意,总地址 space 限制受所用指针大小的限制,32 位指针不能超出 4GB。期间.
And one additional question, is it possible to allocate memory directly outside the total memory space (4GB on 32-bit OS) spared for JVM process ?
4GB 是 32 位 OS 进程的总虚拟地址 space 限制。 4 字节指针不能寻址更多。
你唯一能做的就是打开一个大文件并通过有限数量的内存映射缓冲区与其交互,根据需要映射和释放它们,并希望 OS 页面缓存将它们保存在物理内存。
如果您需要超过 2GB 的内存,您确实应该使用 64 位 OS 和 JVM。
许多 运行 JVM 上的高性能服务器应用程序都使用堆外内存来提高服务器的性能,例如 Apache Cassandra。它曾经将大部分数据结构存储在堆上,但在最近的版本中,它已存储在堆外内存中
最近我在学习 JVM 内部原理时遇到了这些概念。我知道 SO 上已经有很多关于它们的问题,但我仍然无法理解它们之间的关系,或者它们是什么。
现在我这样描述它们:
本机内存 表示正常 JVM 堆之外的内存区域,但仍在 OS 节省的总用户 space 内存范围内对于 JVM 进程(例如在 32 位 Windows 上默认为 2 GB)。这个space是JVM保留的,用来存放一些内部数据,比如Permanent Generation/Method Area等
直接内存表示您通过
使用本机内存java.nio.DirectByteBuffer
.本机堆 意味着您通过
unsafe.allocateMemory
使用本机内存,或者只是在您的 JNI 代码中执行malloc
。堆外与本机内存相同。
还有一个问题,是否可以直接在为 JVM 进程备用的总内存 space(32 位上为 4GB OS)之外分配内存?
请指出我理解中的错误,如果可能的话,请描述清楚。
1) 堆内存:JVM 进程中用于保存 Java 对象并由 JVM 垃圾收集器维护的内存。
2) Native memory/Off-heap: 是在进程地址 space 内分配的内存,它不在堆内,因此不会被释放Java 垃圾收集器。
3) Direct memory: 类似于native,但也意味着共享硬件中的底层缓冲区。例如,网络适配器或图形显示器中的缓冲区。这里的目标是减少相同字节在内存中被复制的次数。
最后,根据 OS 然后额外的本机分配(分配内存地址 space)可以通过不安全分配 and/or 通过内存映射文件来执行。内存映射一个文件特别有趣,因为它可以很容易地分配比机器当前作为物理内存更多的内存。另请注意,总地址 space 限制受所用指针大小的限制,32 位指针不能超出 4GB。期间.
And one additional question, is it possible to allocate memory directly outside the total memory space (4GB on 32-bit OS) spared for JVM process ?
4GB 是 32 位 OS 进程的总虚拟地址 space 限制。 4 字节指针不能寻址更多。
你唯一能做的就是打开一个大文件并通过有限数量的内存映射缓冲区与其交互,根据需要映射和释放它们,并希望 OS 页面缓存将它们保存在物理内存。
如果您需要超过 2GB 的内存,您确实应该使用 64 位 OS 和 JVM。
许多 运行 JVM 上的高性能服务器应用程序都使用堆外内存来提高服务器的性能,例如 Apache Cassandra。它曾经将大部分数据结构存储在堆上,但在最近的版本中,它已存储在堆外内存中