Как мне управлять сборщиком мусора? - PullRequest
0 голосов
/ 14 января 2019

Итак, я пишу алгоритм, который играет в настольную игру против алгоритма моих одноклассников. В основном он предусматривает все возможные исходы игры и выбирает лучший путь, основанный на% побед на каждом пути. В игре у каждого игрока есть 5 секунд, чтобы сделать свой ход. Поскольку все это работает на одном ПК, я не могу использовать вычислительную мощность или слишком много памяти во время движения моих противников.

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

public class Node {

    //coordinates on the board
    private Move move;
    //winpercentage for choosing this path
    private double winPercentage;
    //is this move mine to make or is it opponents (the last person to make a move wins the game)
    private boolean odd;
    //all possible next moves
    private Set<Node> children;
    //previous move
    private Node parent;
}

Я использую класс-оболочку Дерево , которое содержит корень дерева и некоторые методы для обхода и построения структуры.

public class Tree {

    Node root;


    public Tree() {
        this.root = Node.createRoot();
    }

    //methods to traverse/build the tree
} 

Даже после того, как я построил все дерево и выбрал свой ход, дерево остается в памяти во время движения моих оппонентов, что запрещено, поскольку он не может сделать свой ход, пока я занимал 4 ГБ ОЗУ. Я попытался установить ссылку на ноль для запуска GC, но, похоже, она не работает

} else if(input.equals("tree")){
    System.out.println("Showing tree structure");
    Tree tree = new Tree();
    //does all the work
    tree.mainFunctionWrapper(tree.getRoot());
    tree.setRoot(null);
    tree = null;
}

Поскольку все это в одном блоке кода, у меня больше нет ни предыдущих, ни предыдущих ссылок на древовидную структуру.

Как заставить работать сборщик мусора или, возможно, освободить память вручную?

1 Ответ

0 голосов
/ 14 января 2019

Вы не можете запустить GC самостоятельно, потому что System.gc() это просто подсказка. Выполнение tree = null; удалит ссылку, однако объект Tree все еще будет выделен в куче, пока GC не решит удалить его.

Лучше всего улучшить код, чтобы он не требовал 4 ГБ динамической памяти, и ограничьте JVM с помощью -Xmx2g или аналогичной опции. Согласно этот ответ JVM не заинтересован в возврате памяти обратно в систему. Это может случиться, но это не то, что можно делать каждые 5 секунд.

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