Я использую Ignite.NET 2.8.0.20190421 и получил исключение OutOfMemoryException, когда присоединяю непрерывный запрос с использованием ICache.QueryContinuous и долгое время прослушиваю изменения объекта.
Например: на стороне сервера я создаю отдельный объект в кеше.
Затем я запускаю клиент и начинаю прослушивать изменения этого объекта, используя QueryContinuous. И после того, как я очень часто начинаю изменять объект на стороне сервера и ищу его потребление памяти JVM в Java VisualVM - оно постоянно увеличивается до 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 постоянно растет.