首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >堆外、本机堆、直接内存和本机内存之间有什么区别?

堆外、本机堆、直接内存和本机内存之间有什么区别?
EN

Stack Overflow用户
提问于 2015-06-03 14:20:47
回答 3查看 21.7K关注 1票数 34

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

现在我把它们描述为:

  1. 本机内存是指在常规JVM堆之外的内存区域,但仍然在操作系统为JVM进程保留的总用户空间内(例如,在32位Windows上,默认情况下它是2GB)。这个空间由JVM保留,用于存储一些内部数据,如永久生成/方法区域等。
  2. 直接内存意味着您通过java.nio.DirectByteBuffer使用本机内存。
  3. 本机堆意味着您通过unsafe.allocateMemory使用本机内存,或者只需在JNI代码中执行malloc
  4. 离开堆与本机内存相同.

另外一个问题是,是否可以将内存直接分配到用于JVM进程的总内存空间(32位操作系统上为4GB)之外?

请指出我理解中的错误,如果可能的话,给出一个清晰的描述。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-03 14:28:09

1) 堆内存:JVM进程中的内存,用于保存Java,并由JVM垃圾收集器维护。

2) 本机内存/Off堆:是在进程地址空间内分配的内存,该地址空间不在堆内,因此没有被JavaGargary收集器释放。

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

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

票数 36
EN

Stack Overflow用户

发布于 2015-06-03 15:02:59

另外一个问题是,是否可以将内存直接分配到用于JVM进程的总内存空间(32位操作系统上为4GB)之外?

4GB是32位操作系统上进程的总虚拟地址空间限制。4字节指针不能解决更多的问题。

您唯一能做的就是打开一个大文件并通过有限数量的内存映射缓冲区与其交互,根据需要映射和释放它们,并希望OS页面缓存将它们保存在物理内存中。

如果您需要超过2GB的内存,那么您确实应该使用64位操作系统和JVM。

票数 1
EN

Stack Overflow用户

发布于 2019-03-31 03:20:04

很多运行在JVM上的高性能服务器应用程序都使用堆外内存来提高Apache等服务器的性能。它曾经将大部分数据结构存储在堆上,但在最近的版本中,它被存储在堆外内存中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30622818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档