Как я должен переработать узел из дерева? - PullRequest
0 голосов
/ 19 июня 2011

[РЕДАКТИРОВАТЬ] Проблема решена, я обнаружил утечку. Большое спасибо.

Я использую алгоритм планирования с узлами, в которых хранятся следующие данные:

int job[] = new int[Algo.NUM_MACHINES];
int remTime[] = new int[Algo.NUM_MACHINES];
int res = Algo.RESOURCE;
int time = 0;
int tardy = 0;

//Job jobTree[] = new Job[Algo.NUM_JOBS];
ArrayList<Integer> jobsFinished = new ArrayList<Integer>();

int id;
boolean visited = false;
Machine parent = this;//so that root node points to himself
ArrayList<Machine> children = new ArrayList<Machine>();

int duplicate = 0;//duplicate (sj-sj-sj-sj-...) flag

У каждого узла есть ArrayList, который ведет к его дочерним элементам, и родительский узел, который ведет к его родительскому элементу.

Когда я определяю, что узел больше не нужен, это

node.parent.children.remove(node);
node.parent=null;

достаточно, чтобы вызвать перезапуск узла? Как бы вы написали код для перезапуска узла?

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Предполагая, что вы точно описали структуру данных узла и точно описали «алгоритм» «повторного использования» узла, он должен работать.

Если профилировщик сообщает вам, что узлы все еще доступны,тогда они не должны быть одной (или более) из следующих должны быть истинными:

  • У вас есть прямые (сильные) ссылки на узлы в локальных переменныхпараметры метода или некоторая другая структура данных, отдельная от дерева.

  • Ваше дерево на самом деле не имеет форму дерева;то есть узлы были связаны с деревом более чем в одном месте.

  • Вы не вызываете код для перезапуска узлов.

1 голос
/ 19 июня 2011

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

Сборка мусора определяет, какие объекты достижимы по следующим ссылкам.Когда вы перезаписываете ссылку или устанавливаете ее на null, вы прожигаете мост до целевого объекта, и если нет другого способа добраться до этого объекта, память может быть восстановлена.

Насколько далекокак я могу сказать, вам не нужна эта строка:

node.parent=null;

, потому что node становится недоступным, когда он удаляется из ArrayList (если только нет указателя на него в другом месте приложения).Если node недоступен, то не имеет значения, на что он указывает, потому что он уже потоплен.

Если узлы не собираются, но вы думаете, что они должны быть, попробуйте выяснить, на что указываетих.Это может быть даже параметр или переменная в стеке, где-то сохраняющая память.

Отказ от ответственности: Я не знаю Java, поэтому не знаю точно, как работает ее виртуальная машина.Я собираюсь, насколько мне известно, о сборке мусора в целом.

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