Потоки Java для управления памятью - PullRequest
2 голосов
/ 03 сентября 2011

У меня есть приложение, которое выполняет очень последовательный набор отдельных задач.

Моя проблема заключается в том, что одна из первых задач потребляет большой объем памяти, и, несмотря на удаление ссылок на объекты и вызов сборщика мусора,только около половины памяти по существу освобождается.Это влияет на последующие задачи.Проблема также в том, что я хочу временно предоставить JVM большую кучу, чтобы эффективно управлять первой задачей, но я не хочу, чтобы это оставалось до тех пор, пока сборщик мусора не решит, что эффективно освободить все остальное.

У меня былоидея выполнения задачи с интенсивным использованием памяти внутри потока;новый дочерний поток использует родительскую JVM (в этом нет ничего удивительного), но в управлении памятью, похоже, нет никаких изменений.

Как Java обрабатывает память потоков?Есть ли простой способ создать дочернюю кучу для подпотока, которая может быть выгружена после завершения потока?

В качестве дополнения вот что я на самом деле хочу сделать:

  1. Настройка графовой базы данных Neo4j (я создаю несколько миллионов узлов, свойств и связей, а также многочисленные индексы) [интенсивно использует память]
  2. Выполнение запросов к базе данных графов

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Нет, куча распределяется между потоками, и нет способа зарезервировать память для данного потока или позволить потоку нарушать ограничения.Потоки не являются процессами (несмотря на то, что они реализованы таким образом в некоторых jvm).

Вы можете запустить этот поток в отдельном процессе (другой JVM) и передать ему данные через файлы или сокеты, но, хотя это решит проблемы с памятью, оно может убить производительность ... но зависит от того, сколько данныхвам нужно пройти.

2 голосов
/ 03 сентября 2011

Используйте профилировщик памяти, чтобы узнать, какой корень GC поддерживает объекты, которые, как вы ожидали, будут собираться мусором.

Я ожидаю, однако, что Neo4j поддерживает эти объекты живыми, и, возможно, вы мало что можете с этим поделать. В конце концов, ваш график и его индексы должны быть там, чтобы вы могли выполнять запросы к ним.

Возможно, вам удастся найти какой-нибудь вызов API Neo4j, который скажет ему очистить некоторые кэши или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...