On-heap vs Off-heap 堆内内存与堆外内存

版权声明:欢迎转载,注明出处即可 https://blog.csdn.net/yolohohohoho/article/details/88066398

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

猜你喜欢

转载自blog.csdn.net/yolohohohoho/article/details/88066398