Memory 即使onHeapCacheEnabled设置为false,Ignite large query也会将数据存储在内存中

Memory 即使onHeapCacheEnabled设置为false,Ignite large query也会将数据存储在内存中,memory,garbage-collection,ignite,in-memory-database,Memory,Garbage Collection,Ignite,In Memory Database,我在嵌入式模式下运行ignite 2.3,这意味着默认的数据存储模式是堆外模式。我没有在堆缓存上启用 问题是,当我运行一个大型查询时,数据在堆中存储了很长一段时间,最后才被垃圾收集。这是预期的吗?为什么JVM要花这么长时间垃圾收集这些数据 我之所以担心,是因为我的查询以及它在堆上占用的数据会影响我的应用程序性能 我的缓存配置如下: 数据区域最大大小:1228800000L CacheMode.LOCAL 索引类型 Ignite始终在堆外存储数据,堆上缓存是一项功能,它使您能够将Java堆用作堆

我在嵌入式模式下运行ignite 2.3,这意味着默认的数据存储模式是堆外模式。我没有在堆缓存上启用

问题是,当我运行一个大型查询时,数据在堆中存储了很长一段时间,最后才被垃圾收集。这是预期的吗?为什么JVM要花这么长时间垃圾收集这些数据

我之所以担心,是因为我的查询以及它在堆上占用的数据会影响我的应用程序性能

我的缓存配置如下:

  • 数据区域最大大小:1228800000L
  • CacheMode.LOCAL
  • 索引类型

Ignite始终在堆外存储数据,堆上缓存是一项功能,它使您能够将Java堆用作堆外内存的缓存,并配置特定于此缓存的逐出策略

因此,在onHeapCacheEnabled=false的情况下,您在Java堆上观察到的数据不是Ignite缓存数据,而是Java应用程序内存占用,这是绝对应该存在的。如果您遇到与GC相关的应用程序性能问题,请查看Ignite文档中的部分以了解调优技巧,或者在此询问任何特定问题


问候。

好的。有道理。愚蠢的问题:我已经检查了所有ignite API,但是没有像SqlCallBackHandler这样的方法可以获取一堆记录并将其传递给processing,然后继续这个过程,这样我的堆大小就不会增加流形,但是当我显式地告诉GC时,内存会下降到可以忽略不计的程度。SqlFieldsQuery有lazy标志,它以性能价格最大限度地减少了堆消耗:
SqlFieldsQuery.setLazy(true)
我也尝试过同样的方法。它对堆大小没有任何影响。(出于测试目的)我的代码所做的是获取一个大的数据集,并对其进行迭代,甚至不将数据分配给变量,即iterator.hasNext()。->iterator.next()。我错过了什么?顺便说一句,我正在使用QueryCursor。看起来ignite正在检索所有数据,即使我正在使用迭代器并对其进行迭代。这不是我想要的,我想用ignite实现分页。