最近,我在学习JVM内部时遇到了这些概念.我知道关于它们已经有很多关于它们的问题,但我仍然无法理解它们之间的关系,或者它们是什么.
现在我将它们描述为:
直接内存意味着你通过使用本机内存java.nio.DirectByteBuffer.
本机堆意味着您可以通过JNI代码中的本机内存unsafe.allocateMemory或仅使用本机内存malloc.
堆外与本机内存相同.
另外一个问题是,是否有可能直接在总内存空间(32位操作系统上为4GB)之外的内存中分配内存?
请指出我理解中的错误,如果可能的话,请对其进行清楚的描述.
Chr*_*s K 14
1)堆内存:JVM进程内的内存,由JVM管理以表示Java对象
2)本机内存/堆外:是在不在堆内的进程地址空间内分配的内存.
3)直接内存:类似于本机,但也意味着正在共享硬件中的底层缓冲区.例如网络适配器或图形显示中的缓冲区.这里的目标是减少在内存中复制相同字节的次数.
最后,根据操作系统,可以通过Unsafe alloc和/或通过内存映射文件来执行额外的本机分配(分配存储器地址空间).内存映射文件特别有趣,因为它可以轻松地分配比机器当前具有的物理内存更多的内存.另请注意,总地址空间限制受所使用指针大小的限制,32位指针不能超出4GB.期.