Почему бобы @ViewScoped с истекшим сроком действия не уничтожаются до истечения сеанса

Я использую Mojarra 2.2.4 на GlassFish 4 с Java 7.

Как я понимаю из ответа BalusC наКак и когда бин @ViewScoped уничтожается в JSF?Бины @ViewScoped должны быть уничтожены в трех случаях:

Постбэк с ненулевым результатомИстечение сессииПревышено максимальное количество логических представлений в сеансе

Мои бины уничтожаются в первых двух случаях, но не при превышении максимального количества логических представлений. Я проверил, что бобы делаютистекать когда превышен максимум (я получаю исключение ViewExpiredException), но они все еще неразрушенный пока сам сеанс не истекает.

По причинам, связанным с потреблением памяти, я хотел бы уничтожить бины в этом третьем случае, тем более что после истечения срока их действия не будет

ВопросовПочему бобы не уничтожаются, когда они истекают?Это ошибка или ожидаемое поведение?Каким будет чистый обходной путь, чтобы бобы уничтожались?Обновить: OmniFaces ViewScoped аннотация уничтожает бобы, как только они истекают.Минимальный пример

Вот мой боб:

@javax.inject.Named("sandboxController")
@javax.faces.view.ViewScoped
public class SandboxController implements Serializable {
    private static final Logger log = Logger.getLogger(SandboxController.class.getName());
    @PostConstruct
    public void postConstruct() {
        log.log(Level.INFO, "Constructing SandboxController");
    }
    @PreDestroy
    public void preDestroy() {
        log.log(Level.INFO, "Destroying SandboxController");
    }
    public String getData() {
        return "abcdefg";
    }
}

и мой sandbox.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <body>
        <h:form>
            <h:outputText value="#{sandboxController.data}"/>
        </h:form>
    </body>
</html>

и часть моего web.xml:

<context-param>  
    <param-name>com.sun.faces.numberOfLogicalViews</param-name>
    <param-value>3</param-value>
</context-param>
<context-param>  
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>  
    <param-value>3</param-value>
</context-param>

Если я обновлю sandbox.xhtml 50 раз, я получу 50 копийINFO: Constructing SandboxController в журнале. Бобы не уничтожаются, независимо от того, сколько раз я обновляюсь. VisualVM подтверждает, что на бины все еще ссылается ViewMap UIViewRoot. В моем полноразмерном компоненте, который поддерживает достаточное количество состояния, я быстро получаю исключение OutOfMemoryException.

Когда я заканчиваю сеанс вручную, я получаю 50 копийINFO: Destroying SandboxController.

Если я добавляю кнопку отправки в sandbox.xhtml и загружаю ее в 4 разных вкладках, а затем пытаюсь отправить первую, я получаю исключение ViewExpiredException, как и ожидалось, но бин все еще не уничтожен.

Поведение такое же, если я вместо этого использую аннотации javax.faces.bean.ManagedBean и javax.faces.view.ViewScoped. Однако аннотация OmniFaces org.omnifaces.cdi.ViewScoped работает правильно.

Чтобы уточнить ...

Мои бобы @ViewScopedнаходятся уничтожается по истечении сеанса, в отличие от проблем, описанных в смежных вопросах, таких какСвязанные компоненты ViewScoped приводят к утечкам памяти

яне спрашивая, почему каждый боб не уничтоженнемедленно при последующем обновлении, как задано здесь:JSF 2.1 ViewScopedBean @PreDestroy метод не вызывается, Я хочу знать, почему даже когда они истекают и больше не используются, они все еще не уничтожаются и, таким образом, продолжают потреблять память.

Ответы на вопрос(1)

Ваш ответ на вопрос