【发布时间】: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
步骤:
- 使用任何参数启动 IgniteListeners.exe 以启动服务器端,例如“IgniteListeners.exe s”
- 不带参数启动 IgniteListeners.exe 以启动客户端
- 服务器将在一分钟内崩溃,您可以在 Java VisualVM 中看到其 JVM 内存在不断增长。
【问题讨论】:
-
Ignite 2.7.5 会发生这种情况吗?听起来不对,但您正在运行开发版本。
-
@StephenDarlington 2.7.5 及以下版本也是如此。测试开发构建的第一个原因是为了摆脱这个问题。