Отслеживая утечку загрузчика классов в моем веб-приложении TomEE, я создал минималистичное приложение (одна страница JSF, один класс) и понял, что это уже создает утечку загрузчика классов.
Утечки вводятся, например, когда: * используются перечисления * используются определенные лямбды (см. Пример кода) * используются области действия CDI (см. Пример кода) * предоставляется файл beans.xml * ...
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named // no leak
@RequestScoped // introduces a leak!
public class PrincipalTest {
public String userName() {
return "User name from bean.";
}
// some lambdas will remain instanciate after app is stoped
public List<String> names(){
List<String> list = new ArrayList<>();
list.add("aaa");list.add("abb");list.add("acc");
// this lambda implementation is fine:
return list.stream()
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
// this introduces a leak:
// return list.stream()
// .collect(Collectors.toList());
}
Я в значительной степени запутался в этом и чувствую, что у меня нет шансов когда-либо получить «реальное» приложение с бесплатной утечкой классов. Каковы ваши переживания?
Кто-нибудь может подтвердить это поведение? (Я загрузил свои тестовые источники в https://1drv.ms/u/s!AlHB9FAlFWW_iLkHPeUguiu2HSZ8FA?e=2eiBHM - на тот случай, если кому-нибудь понравится играть с ним.)