【问题标题】:java.OutOfMemoryException when using continuous query in Ignite在 Ignite 中使用连续查询时出现 java.OutOfMemoryException
【发布时间】:2019-06-28 09:00:13
【问题描述】:

我正在使用 Ignite.NET 2.8.0.20190421 并在使用 ICache.QueryContinuous 附加连续查询并长时间监听对象的更改时遇到 OutOfMemoryException。

例如:在服务器端,我在缓存中创建单个对象。 然后我启动客户端并开始使用 QueryContinuous 监听这个对象的变化。在我开始经常更改服务器端的对象并在 Java VisualVM 中查找它的 JVM 内存消耗后,它会不断增长,直到出现 OutOfMemoryException。

看起来服务器在其内存中保存了所有变化对象的版本,尽管它们没有用。

例子:

// Our object to store, make it big to easily reproduce the problem
public sealed class DataItem
{
  public int[] Data { get; private set; } = new int[1000000];
}

// Do on the server's side:
// Start Ignite and create cache
while(true)
{
  DataItem item = new DataItem();
  cache.Put(0, item);
  Thread.Sleep(300);
}

// Do on the client's side:
// Start Ignite in client's mode, request cache and start listening
cache.QueryContinuous(query);

完整的 Visual Studio 项目,重现问题:

https://www.dropbox.com/s/aiu3pq0bidkbbif/IgniteListeners.rar?dl=0

步骤:

  1. 使用任何参数启动 IgniteListeners.exe 以启动服务器端,例如“IgniteListeners.exe s”
  2. 不带参数启动 IgniteListeners.exe 以启动客户端
  3. 服务器将在一分钟内崩溃,您可以在 Java VisualVM 中看到其 JVM 内存在不断增长。

【问题讨论】:

  • Ignite 2.7.5 会发生这种情况吗?听起来不对,但您正在运行开发版本。
  • @StephenDarlington 2.7.5 及以下版本也是如此。测试开发构建的第一个原因是为了摆脱这个问题。

标签: c# .net ignite


【解决方案1】:

这似乎是一个已知问题。这与连续查询中过度使用内存有关,Ignite 节点需要在缓冲区中存储多达 1000 个更新。如果条目很重,可能会导致 OOM。在这里您可以跟踪进度https://issues.apache.org/jira/browse/IGNITE-11970

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多