Моя java программа зависает время от времени и может иметь утечку памяти. Полезна ли моя телеметрия? - PullRequest
0 голосов
/ 31 марта 2020

Я недавно начал изучать java (теперь у меня есть дополнительное свободное время) и написал код для игры под названием Torn с использованием NetBeans 8.2. Этот код является работоспособным, который непрерывно извлекает данные с сайта и сохраняет их для последующего использования. В середине запуска было зависание, и мне сказали, что добавление тайм-аута соединения и тайм-аута чтения для URL-соединения может помочь. Я сделал это, и в настоящее время он снова работает (пока все хорошо), и я жду, чтобы увидеть, возникнет ли эта проблема снова или нет.

Мой вопрос касается поиска утечки памяти . Я читал, что количество выживших поколений является показателем того, есть ли утечка памяти. Это снимок экрана телеметрии после нескольких часов работы. Также доступен код для проекта (OtherFactionsStats. java - основной класс). (Любые замечания по улучшению моего кода также приветствуются: D). Я ценю помощь.

1 Ответ

1 голос
/ 31 марта 2020

Я думаю, что я наконец-то обнаружил утечку вашего ресурса: в LogFactionPersonalStat в строке 154 вы открываете файл с in = new BufferedReader(..., который никогда не закрывается.

Я предлагаю вам узнать о try с ресурсами .

Код в том же файле, например строки 128-130, изменится с

    FileWriter file = new FileWriter("" + path + completed); //set completion status to incomplete
    file.write("0"); //zero means not yet complete
    file.close();

на

    try (FileWriter file = new FileWriter("" + path + completed)) { //set completion status to incomplete
        file.write("0"); //zero means not yet complete
    }

Не большой изменить, но теперь вы не можете забыть о закрытии FileWriter (или BufferedWriter или BufferedReader)


Еще одно примечание: RunUpdate строка 53 выглядит очень подозрительно (этот шаблон повторяется несколько раз раз):

    Logger.getLogger("Error reading from file");

Здесь вы создаете логиер для «Ошибка чтения из файла», но вы никогда не используете этот регистратор для записи чего-либо в журнал.

Вы, вероятно, хотели что-то написать как

    Logger.getLogger(OtherFactionsStats.class.getName()).severe("Error: Possible timeout or problems with file");

или

    Logger.getLogger(OtherFactionsStats.class.getName()).log(Level.Severe, "Error: Possible timeout or problems with file");
...