最近,我在学习JVM内部时遇到了这些概念。我知道关于它们的问题已经很多,但我仍然不能理解它们之间的关系,或者简单地说它们是什么。
现在我把它们描述为:
java.nio.DirectByteBuffer
使用本机内存。unsafe.allocateMemory
使用本机内存,或者只需在JNI代码中执行malloc
。另外一个问题是,是否可以将内存直接分配到用于JVM进程的总内存空间(32位操作系统上为4GB)之外?
请指出我理解中的错误,如果可能的话,给出一个清晰的描述。
发布于 2015-06-03 14:28:09
1) 堆内存:JVM进程中的内存,用于保存Java,并由JVM垃圾收集器维护。
2) 本机内存/Off堆:是在进程地址空间内分配的内存,该地址空间不在堆内,因此没有被JavaGargary收集器释放。
3) 直接内存:类似于本机,但也意味着硬件中的底层缓冲区正在共享。例如,网络适配器或图形显示中的缓冲区。这里的目标是减少内存中复制相同字节的次数。
最后,根据操作系统的不同,可以通过不安全的分配和/或内存映射文件来执行额外的本机分配(分配内存地址空间)。文件的内存映射特别有趣,因为它可以轻松地分配比机器当前物理内存更多的内存。还请注意,总地址空间限制受所使用指针大小的限制,32位指针不能超出4GB。句号。
发布于 2015-06-03 15:02:59
另外一个问题是,是否可以将内存直接分配到用于JVM进程的总内存空间(32位操作系统上为4GB)之外?
4GB是32位操作系统上进程的总虚拟地址空间限制。4字节指针不能解决更多的问题。
您唯一能做的就是打开一个大文件并通过有限数量的内存映射缓冲区与其交互,根据需要映射和释放它们,并希望OS页面缓存将它们保存在物理内存中。
如果您需要超过2GB的内存,那么您确实应该使用64位操作系统和JVM。
发布于 2019-03-31 03:20:04
很多运行在JVM上的高性能服务器应用程序都使用堆外内存来提高Apache等服务器的性能。它曾经将大部分数据结构存储在堆上,但在最近的版本中,它被存储在堆外内存中。
https://stackoverflow.com/questions/30622818
复制相似问题