繁体   English   中英

“堆上”和“堆外”的区别

[英]Difference between “on-heap” and “off-heap”

Ehcache谈论堆内和堆外内存。 有什么区别? 哪些 JVM 参数用于配置它们?

堆上存储是指将出现在 Java 堆中(也受 GC)的对象。 另一方面,堆外存储是指由 EHCache 管理的(序列化的)对象,但存储在堆外(也不受 GC 影响)。 由于堆外存储继续在内存中管理,它比堆上存储稍慢,但仍然比磁盘存储快。

问题中发布的链接中涉及管理和使用非堆存储的内部细节不是很明显,因此查看用于管理非磁盘的Terracotta BigMemory的详细信息是明智的店铺。 BigMemory(堆外存储)用于避免在几兆字节或千兆字节大的堆上的 GC 开销。 BigMemory 通过直接的 ByteBuffer使用 JVM 进程的内存地址空间,与其他原生 Java 对象不同,这些ByteBuffer不受 GC 的影响。

来自http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOff

什么是堆卸载?

通常您分配的所有非临时对象都由 java 的垃圾收集器管理。 尽管 VM 在垃圾收集方面做得不错,但在某个时刻,VM 必须执行所谓的“完整 GC”。 完整的 GC 涉及扫描完整的分配堆,这意味着 GC 暂停/减速与应用程序堆大小成正比。 所以不要相信任何告诉你“内存很便宜”的人。 在 Java 中,内存消耗会损害性能。 此外,使用堆大小 > 1 Gb 时可能会出现明显的暂停。 如果您有任何近乎实时的事情发生,这可能会令人讨厌,在集群或网格中,Java 进程可能会无响应并从集群中删除。

然而,今天的服务器应用程序(通常建立在臃肿的框架之上;-))很容易需要远远超过 4Gb 的堆。

这些内存需求的一种解决方案是将对象的一部分“卸载”到非 Java 堆(直接从操作系统分配)。 幸运的是,java.nio 提供了直接分配/读取和写入“非托管”内存块(甚至内存映射文件)的类。

因此,可以分配大量“非托管”内存并使用它来保存对象。 为了将任意对象保存到非托管内存中,最可行的解决方案是使用序列化。 这意味着应用程序将对象序列化到堆外内存中,稍后可以使用反序列化读取对象。

Java VM 管理的堆大小可以保持很小,因此 GC 暂停在毫秒内,每个人都很高兴,工作完成。

很明显,这种堆外缓冲区的性能主要取决于序列化实现的性能。 好消息:出于某种原因,FST 序列化非常快:-)。

示例使用场景:

  • 服务器应用程序中的会话缓存。 使用内存映射文件来存储 GB 的(非活动)用户会话。 一旦用户登录到您的应用程序,您就可以快速访问与用户相关的数据,而无需处理数据库。
  • 缓存计算结果(查询、html 页面等)(仅适用于计算比反序列化结果对象 ofc 慢的情况)。
  • 使用内存映射文件非常简单快速的持久化

编辑:对于某些场景,人们可能会选择更复杂的垃圾收集算法,例如 ConcurrentMarkAndSweep 或 G1 来支持更大的堆(但这也有超过 16GB 堆的限制)。 还有一个带有改进的“无暂停”GC (Azul) 的商业 JVM。

堆是内存中动态分配的对象所在的地方。 如果你使用new那么它就在堆上。 这与堆栈空间相反,堆栈空间是函数堆栈所在的地方。 如果您有一个局部变量,则该引用位于堆栈中。 Java 的堆受垃圾回收的影响,对象可以直接使用。

EHCache 的堆外存储将您的常规对象从堆中取出,对其进行序列化,并将其作为字节存储在 EHCache 管理的一块内存中。 这就像将它存储到磁盘,但它仍然在 RAM 中。 对象在这种状态下不能直接使用,它们必须首先反序列化。 也不受垃圾收集的影响。

简而言之

简而言之,Java On/Off 堆存储

图片来源


详细图片

Java On/Off Heap 存储详解

图片来源

JVM 对堆外内存一无所知。 Ehcache 实现了磁盘缓存和内存缓存。

不是 100%; 然而,听起来堆是一个对象或一组分配的空间(在 RAM 上),它内置于 Java 本身或更可能来自 ehcache 本身的代码功能中,而堆外 Ram 是有自己的系统作为好; 然而,这听起来像是慢了一个数量级,因为它没有组织,这意味着它可能不使用堆(意味着一组长的 ram 空间),而是使用不同的地址空间,这可能会使其效率稍低。

然后当然下一层是硬盘驱动器空间本身。

我不使用 ehcache,所以你可能不想相信我,但这是我从他们的文档中收集到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM