堆外,本机堆,直接内存和本机内存

Chr*_*ris 16 java memory jvm

最近,我在学习JVM内部时遇到了这些概念.我知道关于它们已经有很多关于它们的问题,但我仍然无法理解它们之间的关系,或者它们是什么.

现在我将它们描述为:

  1. 本机内存意味着正常JVM堆之外的内存区域,但仍然位于操作系统为JVM进程节省的总用户空间内存中(例如,在32位Windows上,它默认为2 GB).JVM保留此空间以存储一些内部数据,例如永久生成/方法区域等.
  2. 直接内存意味着你通过使用本机内存java.nio.DirectByteBuffer.

  3. 本机堆意味着您可以通过JNI代码中的本机内存unsafe.allocateMemory或仅使用本机内存malloc.

  4. 堆外与本机内存相同.

另外一个问题是,是否有可能直接在总内存空间(32位操作系统上为4GB)之外的内存中分配内存?

请指出我理解中的错误,如果可能的话,请对其进行清楚的描述.

Chr*_*s K 14

1)堆内存:JVM进程内的内存,由JVM管理以表示Java对象

2)本机内存/堆外:是在不在堆内的进程地址空间内分配的内存.

3)直接内存:类似于本机,但也意味着正在共享硬件中的底层缓冲区.例如网络适配器或图形显示中的缓冲区.这里的目标是减少在内存中复制相同字节的次数.

最后,根据操作系统,可以通过Unsafe alloc和/或通过内存映射文件来执行额外的本机分配(分配存储器地址空间).内存映射文件特别有趣,因为它可以轻松地分配比机器当前具有的物理内存更多的内存.另请注意,总地址空间限制受所使用指针大小的限制,32位指针不能超出4GB.期.

  • 我真的很难理解 java 和 OS 提供的内存分段。现在操作系统将进程的地址空间划分为多个段,如堆堆栈数据文本,同样,JVM 进程内存将具有操作系统提供的这些段。现在当 JVM 开始执行 JAVA 程序时,它(JVM)再次提供类似于 java 程序的分段。现在我真的很困惑这两种类型的内存分段,由操作系统提供,然后由 JVM 提供给 java 程序。你能帮我理解这一点吗。 (4认同)