Сборка мусора Spring Service - PullRequest
       15

Сборка мусора Spring Service

0 голосов
/ 19 марта 2019

Моя проблема в том, что у меня есть класс обслуживания, который вызывает API.Итак, в этом классе я создаю несколько объектов, которые я верну клиенту (запрос REST).Это хорошая практика?Потому что моя память растет с каждым запросом, и нет сборки мусора?

@org.springframework.stereotype.Service("FanService")
public class Service {

private static final Logger log = LoggerFactory.getLogger(Service.class);
public List<String> allCLubsInLeague() {


    try {

        URI urlString = new URI("https://www.thesportsdb.com/api/v1/json/1/search_all_teams.php?l=German%20Bundesliga");
        RestTemplate restTemplate = new RestTemplate();

        TeamsList response = restTemplate.getForObject(
                urlString,
                TeamsList.class
        );
        List<BundesligaTeams> bundesligaTeams = response.getTeams();

        //ResponseEntity<List<BundesligaTeams>> test = t.getForEntity(urlString, BundesligaTeams.class);


        List<String> teamList = new ArrayList<>();
        bundesligaTeams.forEach(value -> teamList.add(value.getStrTeam()));
        log.info(bundesligaTeams.get(0).getStrAlternate());
        bundesligaTeams = null;
        response = null;
        urlString = null;
        restTemplate = null;
        return teamList;

    }
    catch (Exception e){log.info(e.getMessage());}
    return null;
}
}

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Я не вижу утечки памяти в этом коде.

  • Ваша память увеличивается в каждом запросе, потому что сборщик мусора будет собирать неиспользуемые объекты, когда решит это сделать.Таким образом, ваши объекты могут быть обработаны после 10 или 20 запросов - вы никогда не узнаете.
  • Это происходит потому, что у вас все еще есть много свободной памяти в куче, поэтому сборщик мусора еще не вынужден очищать ее.Если вы попытаетесь вызвать много запросов, вы скоро увидите активность сборщика мусора.
  • Если вы хотите увидеть больше деталей, вы всегда можете запустить jvisualvm, который должен поставляться с JDK, и посмотреть, как ваша куча памятиувеличение / уменьшение в зависимости от активности сборщика мусора
0 голосов
/ 19 марта 2019

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

Можно создавать объекты, если у вас есть доступная память, выделение памяти дешево по сравнению с GET-запросом. См. номера задержки, которые должен знать каждый программист .

  1. Нет никаких оснований для null локальной переменной, если вы не пытаетесь удалить учетные данные безопасности. Не пишите bundesligaTeams = null; и другие операторы в конце, эти объекты будут собраны, как только они не будут доступны.

  2. RestTemplate должен быть отдельным бобом. Создание этого объекта может быть дорогим, если создание подчиненного HTTP-клиента стоит дорого. Рассмотрим автоматическое подключение по умолчанию RestTemplate, предоставляемое Spring Boot.

  3. Кэшировать результат запроса GET локально, если данные не часто меняются. Список всех клубов немецкой бундеслиги будет меняться только один раз в год.

  4. Следует избегать создания String для log.info() вызова, если уровень ведения журнала info не включен. Либо используйте синтаксис заполнителя, либо звоните log.isInfoEnabled() раньше. Проверьте Какой самый быстрый способ (не) регистрации? FAQ.

...