В сервисе Spring я должен установить нулевые или пустые списки, используемые в конце метода для экономии памяти? - PullRequest
0 голосов
/ 30 августа 2018

Я использую весеннюю загрузку (сгенерированную JHipster) с некоторыми сервисами, которые используют список как поле.
Мне было интересно, должен ли я очистить или обнулить этот список в конце методов, которые его используют.
Есть ли какое-либо влияние на память JVM?
Учитывая, что этот метод может вызываться 100x + в день, и учитывая, что каждый пользователь имеет свой собственный контекст выполнения, поэтому поля, насколько я понимаю, не стирают предыдущие.

Пример:

package fr.vyvcareit.poccarto.service;

//imports

@Service
@Transactional
public class SiteService {

    //Liste temporaire pour repérer les doublons
    private List<String> siteCodesDansImport ;

    public SiteService() {  }

    public void preImportSiteError(List<Object> rows) {

        this.siteCodesDansImport = new ArrayList<String>();

        for (int i = 0; i < rows.size(); i++) {      
            checkSiteCode(int num_ligne, HashMap row);
        }
        // I'm all done, I do not need this.siteCodesDansImport anymore...
        this.siteCodesDansImport=null; // => Is this line important for java memory ???

    }

    private void checkSiteCode(int num_ligne, HashMap row){
        ...
        siteCodesDansImport.add(site_code);
        ...
    }
}

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 30 августа 2018

По умолчанию Spring bean имеет одноэлементную область видимости. Это означает, что ваш сервис имеет один экземпляр на приложение. Наличие полей на одноэлементных компонентах не является потокобезопасным, и его следует избегать.

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

Никогда не сохраняйте состояние в переменных поля одноэлементных бинов.

Для вашей коллекции просто используйте локальную переменную. Передайте его через параметры метода (например, в checkSiteCode). В конце выполнения вам не нужно устанавливать его на null. Об этом позаботится Java GC.

...