On-heap vs Off-heap 堆内内存与堆外内存
JVM主要的内存区域有
- heap
- stack
- 其它寄存器。
heap主要是用来存储对象实例及数组值,可以认为java中所有通过new创建的对象都在此分配。
On-heap是指在堆内内存,由GC进行创建回收,可以通过参数-Xms
(最小)和-Xmx
(最大)来控制
Off-heap是指在堆外内存,不由GC创建,但可以通过full GC回收,通过-XX:MaxDirectMemorySize
设置大小。
通俗的讲,Off-heap存储就好比在Java堆外部的数据库中存储对象。
优点是我们可以在该数据库中存储大量对象,而不受垃圾收集器管理。
但是,当我们运行查询以从该数据库检索对象时,这些对象将复制到Java堆上。
如果我们的应用程序经常检索某个对象,然后在处理请求时丢弃它们,则必须对每个请求检索的对象进行垃圾回收。
而若我们使用On-heap存储,在处理每个请求后,所需的对象将保留在堆上,以备后续请求继续使用。
缓存数据存放一般支持On-heap及Off-heap:
堆内存放开销小、效率高、存储大小受限制,
堆外存放开销大(还是比disk快,建议使用缓冲池)、存储容量较大,适合 存储不怎么变化 的数据。
参考资料
groups.google.com