"堆上"和"堆外"之间的区别

Syn*_*sso 133 java memory heap ehcache

Ehcache 讨论了堆上和堆外内存.有什么不同?使用什么JVM args来配置它们?

Vin*_*lds 157

堆上存储引用将存在于Java堆中的对象(并且还受GC影响).另一方面,堆外存储是指由EHCache管理但存储在堆外(并且不受GC影响)的(序列化)对象.由于堆外存储继续在内存中进行管理,它比堆上存储稍慢,但仍然比磁盘存储更快.

在堆内存储的管理和使用中涉及的内部细节在问题中发布的链接中不是很明显,因此最好查看用于管理磁盘的Terracotta BigMemory的详细信息.商店.BigMemory(堆外存储)用于避免GC在几兆字节或千兆字节大的堆上的开销.BigMemory使用JVM进程的内存地址空间,通过不像其他本机Java对象那样不受GC影响的直接ByteBuffers.

  • +1提及直接ByteBuffers进一步探索;) (18认同)
  • Direct ByteBuffers提供对非托管内存的访问,但它们本身受GC限制(与它们指向的数据相反).这很重要,因为直接ByteBuffer(在ByteBuffer.allocateDirect的那种,不是那种MMAP)将通过GC收集,当它被收集它的Deallocater会得到触发,有效地收集非托管内存. (3认同)

R.M*_*ler 87

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

什么是堆卸载?

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

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

这些内存要求的一个解决方案是将对象的一部分"卸载"到非java堆(直接从OS分配).幸运的是,java.nio提供了直接分配/读取和写入"非托管"内存块(甚至是内存映射文件)的类.

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

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

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

示例使用场景:

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

编辑:对于某些情况,可以选择更复杂的垃圾收集算法,如ConcurrentMarkAndSweep或G1,以支持更大的堆(但这也有超过16GB堆的限制).还有一个商用JVM,具有改进的"无暂停"GC(Azul).

  • "分配大量'非托管'内存,并使用它来保存对象" - 你无法保存对象.您可以存储基元,可以将它们包装在您喜欢的任何库中,但这些不是对象.你在offheap中放置的数据没有对象标题,你无法对它进行同步,你不能用其他对象中的引用字段来引用它. (4认同)

Ada*_*dam 36

堆是内存中动态分配的对象所在的位置.如果您使用new它然后它在堆上.这与堆栈空间相反,堆栈空间是函数堆栈所在的位置.如果您有一个局部变量,那么该引用就在堆栈上.Java的堆可以进行垃圾收集,对象可以直接使用.

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

  • 有很多方法.由于对象不再位于主Java堆上,因此它们不会浪费垃圾收集器的时间,它们不会对JVM的堆进行分段,而是为其他更常用的对象释放空间.此外,由于它们是序列化的,并且在不久的将来可能不需要,因此可以根据需要对其进行压缩,移动,甚至可以将其分页到磁盘. (2认同)

mrs*_*vas 14

简而言之

Java On/Off Heap存储简而言之

pic学分


详细图片

Java On/Off堆存储详细信息

pic学分