Исключение java .lang.OutOfMemoryError: Java в рекурсии происходит кучи - PullRequest
0 голосов
/ 04 марта 2020

Я использую IntelliJ в качестве редактора. Это мои vmoptions:

-Xms1024m

-Xmx4096m

-XX:MaxPermSize=700m

-XX:ReservedCodeCacheSize=480m

-XX:SoftRefLRUPolicyMSPerMB=50

Есть ли что-то еще, что я могу изменить в настройках, чтобы он работал у меня?

Мой алгоритм пытается вычислить проблему умножения матричной цепочки с помощью Branch & Bound, и в этой части (код ниже) я выполняю преемник для углубленного поиска / создания и т. Д. c. Я предполагаю, что эта рекурсия вызывает проблему кучи.

 public  static  SimpleMCPNode createTree(SimpleMCPNode currentNode) {
//other statements 
.
.
.
.
for (int i = 0; i < currentNode.matrices.size() - 1; i++) {
        List<MatrixInfo> adaptedList = new ArrayList(currentNode.matrices);
        currentNode.successors.add(createTree(currentNode.createSuccessor(adaptedList, i)));
    }
//other statements
.
.

В зависимости от входных данных она может расти в геометрической прогрессии ...

1 Ответ

0 голосов
/ 04 марта 2020

Вам не нужно каждый раз инициализировать новый массив.

Пожалуйста, используйте:

ArrayList<MatrixInfo> adaptedList = new ArrayList<MatrixInfo>();
for(int i=0; i< 10; i++){
  currentNode.successors.add(createTree(currentNode.createSuccessor(adaptedList,i)));
  adaptedList.clear() 
}
...