2010-09-19 6 views
0

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

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

Это код:

<?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> 

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

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

+0

Скопируйте и вставьте вызов 'setInterval' и код, в котором он запущен. –

+0

Это отправляет запрос каждую секунду серверу, поэтому вы можете посмотреть, как обрабатывается запрос. Вы также можете захотеть увеличить интервальный таймер, 1 секунда очень короткая, учитывая, что округление может занять больше времени. – BGerrissen

+0

Если я увеличиваю интервал, память медленно растет, но через несколько дней сервер вылетает из outOfMemory. Очевидно, что веб-страница должна быть открыта в браузере. –

ответ

0

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

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

+0

Таким образом, без setInterval в HasMap используется увеличение памяти на 40 байт каждые 10 секунд, в то время как с setInterval увеличение памяти примерно на 2Kb каждые 10 секунд. –

+0

@ user451960 Проблема не в самом деле 'setInterval', проблема в том, что на самом деле происходит на стороне сервера, когда выполняется конкретный запрос, запускаемый каждую секунду. –

+0

Однако я делаю простое приложение для чата, и я использую Primefaces p: poll (он использует setInterval) для обновления данных. Когда я протестировал приложение с пользователями, сбой приложения в outOfMemory через несколько часов. Поэтому без изменения кода я использовал Icefaces Push почти setInterval. Теперь приложение никогда не падает. Поэтому я уверен, что setInterval - проблема. –