Это вопрос, касающийся проблемы java.lang.OutOfMemoryError: GC overhead limit exceeded
, наблюдаемой при выполнении операций с JanusGraph.
Настройка
Я использую версию JanusGraph 0.2.0
с Cassandra в качестве основного хранилища.Я использую значения конфигурации по умолчанию, как описано здесь , за исключением конфигурации, описывающей мой сервер хранения как cql
и хост хранения.
Я вставляю большой список пользователей в график- у каждого есть (1) электронная почта, (2) идентификатор пользователя и (3) ассоциированная метка группировки.Для этого сценария все пользователи находятся в одной группе, которую мы назовем groupA
.Вставки выполняются последовательно, каждая выполняется сразу после завершения предыдущего.
Во время каждой операции вставки я создаю одну вершину, представляющую электронное письмо, одну вершину, представляющую идентификатор пользователя, затем создаю или обновляю вершину, представляющую groupA
,Я создаю ребро между (1) версией userID <-> userID и ребром (2) userID <-> groupA
вершина.
Наблюдаемая проблема
Я использовалпрофилировщик для наблюдения за использованием пространства кучи во время процесса.Вначале вставки выполнялись без проблем, но по мере увеличения количества вставок занимаемое пространство кучи увеличивалось.В конце концов, когда использовалось больше памяти, я достиг исключения «Недостаточно памяти» после нескольких часов работы.
-
Затем я повторил вставку второй раз, но на этот раз я не сделал этого.включите вершину groupA
.На этот раз использование памяти показало стандартный пилообразный паттерн с течением времени, как показано ниже.
Это приводит меня к выводу, что проблемы с нехваткой памятинаблюдаемые были из-за операций с этой вершиной groupA
высокой степени.
Потенциальные потенциальные возможности
В настоящее время я подозреваю, что в JanusGraph существует некоторый процесс кэширования, в котором хранятся недавно открытые элементы.Так как список смежности вершины группы высокой степени велик, то может кэшироваться большой объем данных, который увеличивается только по мере того, как я создаю все больше ребер из вершины группы в вершины идентификатора пользователя.
Использование моегоПрофилировщик, я заметил, что класс org.janusgraph.graphdb.relations.RelationCache
использовал относительно высокое использование памяти, поэтому это кажется уместным.
Мой вопрос
Мой вопрос: в чем причина этого?со временем JanusGraph все больше использует память?