setInterval jsf2.0 Glassfish v3 и утечки памяти

ребята, я новичок, и я не английский. У меня проблема с использованием js setInterval, которые имитируют щелчок пользователя каждые X секунд на кнопке отправки. На странице есть только один h:form и h:commandButton. Я использую профилировщик и вижу, что размер java.util.HashMap постоянно увеличивается. Через несколько часов используемый размер кучи значительно увеличился относительно начальной точки.

Пожалуйста, помогите мне, эта проблема сводит меня с ума.

Это код:

<?xml version = "1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <script type="text/javascript">
            var timeoutId = window.setInterval( "userClick()" , 1000 );
        </script>
    </h:head>
    <h:body>
    <h:panelGroup id="testo">test</h:panelGroup>
    <h:form prependId="false" >
        <h:commandButton id="buttonId"
                         action="null"
                         value="Invia">
            <f:ajax event="click" execute="@form" render=":testo"/>
        </h:commandButton>
    </h:form>
    <script type="text/javascript">
    function userClick()
    {
        document.getElementById('buttonId').click();
    }
    </script>
    </h:body>
</html>

Обновление: через 1 дня снова произошел сбой приложения. Теперь я использовал только setInterval, но у меня есть heapDump, сгенерированный Glassfish, это скриншот, но я не могу опубликовать его, потому что моя репутация слишком низкая. однако java.lang.Object[] потребляет 20% кучи, java.util.HashMap$Entry[]18% и HashMap 10% Есть идеи?

Обновление: Привет, ребята, я решил свою проблему и обнаружил ошибку в зависимости/внедрении CDI. Я решил свою проблему, изменив аннотацию @Named на @ManagedBean, и это решило мою проблему. В примере я опустил код, потому что думаю, что CDI не содержит ошибок. Очевидно, что Bean-компонент с аннотацией @Named имеет запрос Scoped, в то время как Bean-компонент ApplicationScoped не создает ошибку. Я относительно новичок в CDI, так куда я должен сообщить об ошибке?


person Roberto de Santis    schedule 19.09.2010    source источник
comment
Скопируйте и вставьте вызов setInterval и код, который он выполняет.   -  person T.J. Crowder    schedule 19.09.2010
comment
Это отправляет запрос на сервер каждую секунду, поэтому вы можете посмотреть, как обрабатывается запрос. Вы также можете увеличить интервальный таймер, 1 секунда очень коротка, учитывая, что поездка туда и обратно может занять больше времени.   -  person BGerrissen    schedule 19.09.2010
comment
Если я увеличу интервал, память будет расти медленно, но через несколько дней произойдет сбой сервера в outOfMemory. Очевидно, что веб-страница должна быть открыта в браузере.   -  person Roberto de Santis    schedule 19.09.2010


Ответы (1)


Через несколько часов используемый размер кучи значительно увеличился относительно начальной точки.

Ok. Но какое использование памяти вы получаете после сборки мусора (GC)? Я предлагаю включить ведение журнала GC (-Xloggc:file.log) и, возможно, опубликовать график результатов здесь. Также убедитесь, что вы используете последнюю версию GlassFish (3.0.1).

person Pascal Thivent    schedule 19.09.2010
comment
Таким образом, без setInterval HasMap использовал увеличение памяти на 40 байт каждые 10 секунд, а с setInterval увеличение памяти примерно на 2 КБ каждые 10 секунд. - person Roberto de Santis; 19.09.2010
comment
@user451960 user451960 Проблема на самом деле не в setInterval, проблема в том, что на самом деле происходит на стороне сервера, когда выполняется конкретный запрос, запускаемый каждую секунду. - person Pascal Thivent; 19.09.2010
comment
Однако я делаю простое приложение для чата и использую Primefaces p:poll (он использует setInterval) для обновления данных. Когда я тестировал приложение с пользователями, через несколько часов приложение вылетало в outOfMemory. Поэтому без изменений в коде я использовал Icefaces Push почти из setInterval. Теперь приложение никогда не вылетает. Поэтому я уверен, что проблема в setInterval. - person Roberto de Santis; 19.09.2010
comment
@user451960 user451960 Вам нужно посмотреть на полученную разницу с точки зрения сервера. - person Pascal Thivent; 19.09.2010
comment
Я не опытный программист, мне трудно понять, что может вызвать эту проблему. Теперь я пытаюсь использовать setInterval без использования компонента p:poll primefaces. Однако я включаю регистрацию GC. Спасибо за предложение - person Roberto de Santis; 19.09.2010
comment
@user: setInterval() — это штука JavaScript, которая запускается в веб-браузере и абсолютно не влияет на память веб-сервера. Это логика кода Java/JSF, работающая на веб-сервере, которая вызывает проблемы. Как теперь кажется, причиной проблемы является логика на стороне сервера, которая прослушивает опросы Primefaces p:poll. Как насчет Primefaces p:push? Я предлагаю сообщить об этой проблеме ребятам из Primefaces. - person BalusC; 19.09.2010
comment
p:push может быть решением (за исключением проблемы с атмосферой со стеклянной рыбой), но я предпочитаю толчок icefaces, который отлично работает. Проблема Icefaces push заключается в том, что время ожидания соединения, которое я установил в своем web.xml, игнорируется (мне тоже нужно сообщить об этом). Я относительно новичок в простых лицах, поэтому изначально я думал, что утечка памяти была вызвана моими кодами. В эти дни я думаю сообщить об этом на форум Primefaces. С jsf 2.0 и Primefaces я тоже использую Spring, но когда я удаляю p:poll, проблема решается, поэтому я думаю, что Spring не имеет значения. - person Roberto de Santis; 19.09.2010