java.OutOfMemoryException при использовании непрерывного запроса в Ignite - PullRequest
0 голосов
/ 28 июня 2019

Я использую 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

Шаги:

  1. Запустите IgniteListeners.exe с любым аргументом для запуска на стороне сервера, например, «IgniteListeners.exe s»
  2. Запустите IgniteListeners.exe без аргументов для запуска клиента
  3. Сервер рухнет через минуту, вы можете видеть в Java VisualVM его память JVM постоянно растет.

1 Ответ

0 голосов
/ 09 июля 2019

Кажется, это известная проблема. Это связано с чрезмерным использованием памяти в непрерывных запросах, узел Ignite должен хранить до 1000 обновлений в буфере. Это может привести к OOM, если записи тяжелые. Здесь вы можете отслеживать прогресс https://issues.apache.org/jira/browse/IGNITE-11970.

...