2012-06-01 1 views
0

Найден в GWT версии:GWT ссылки утечка памяти для запроса построителя (порожденной GWTP действий сервера вызовов)

GWT - 2.4.0

Встречающиеся на OS/Browser:

Windows 7 с IE9

Подробное описание (пожалуйста, как можно более конкретным):

Из исключения кучи произошло после того, осталось GWT App для запуска на ночь, Диагностика с MemoryAnalyzer, обнаружил, что при сбое есть 1,6 миллиона экземпляров com.google.gwt.http.client.RequestBuilder, каждый размер которых составляет 1208 байт.

Дальнейшая проверка показывает мне, что эти запросы являются вызовом GWT Action для сервера для проверки состояния текущего состояния сервера. опрос триггера по com.google.gwt.user.client.Timer каждые 1 сек

Кратчайший фрагмент кода, который демонстрирует вопрос:

@Inject 
public MainPresenter(final EventBus eventBus, final MyView view, 
     final MyProxy proxy, PlaceManager placeManager, 
     final DispatchAsync dispatcher) { 
    super(eventBus, view, proxy); 
    this.placeManager = placeManager; 
    this.dispatcher = dispatcher; 
    getView().setUiHandlers(this); 

    setupSeverHealthQuerier(dispatcher); 
} 

private void setupSeverHealthQuerier(final DispatchAsync dispatcher) { 
    int delayInSec = UserPreference.HealthCheckInterval; 

    serverHealthChecker = new Timer() { 

     @Override 
     public void run() { 
      dispatcher.execute(new GetServerHealth(ServerName.ReplayServerGTU), 
        new AsyncCallback<GetServerHealthResult>() { 

         @Override 
         public void onFailure(Throwable caught) { 
          caught.printStackTrace(); 
         } 

         @Override 
         public void onSuccess(GetServerHealthResult result) { 
          getView().setServerHealthPic(result.getHealth()); 
         } 
        }); 

     } 
    }; 
    serverHealthChecker.scheduleRepeating(delayInSec * 1000); 
} 

Вот отчет Heap:

http://i.stack.imgur.com/C2qJy.png

  • 10 правило репутации на пост
+0

oops, Итак, мой вопрос в том, почему эти конструкторы запросов все еще находятся в куче слева, чтобы создать, и как я могу решить проблему утечки памяти. Спасибо за помощь заранее –

ответ

3

Это не RequestBuilder экземпляры, но экземпляры анонимного внутреннего класса, которые могут быть только базовыми XMLHttpRequest's ReadyStateChangeHandler.

Учитывая, что вы оставили свою сессию DevMode всю ночь, не могли ли вы перевести компьютер на режим ожидания режим (извините, я не знаю точного термина на английском языке) и отключил сеть?
Учитывая, что вы, кажется, используете IE, и IE никогда не откладывает запросы, действительно может быть, что запросы были сделаны, но никогда не доходили до сети и никогда не прерывались, поэтому классы хранятся в памяти.

Просто идея.

Я бы также поспорил, что это только проблема в DevMode и IE.
Это очень необычное использование DevMode, поэтому я бы не назвал его ошибкой. Это также не стоит исправлять, так как команда GWT работает над новым SuperDevMode, который больше не требует плагина браузера, но вместо этого всегда компилирует код в JS, на лету.


Попробуйте планировать таймер снова с onFailure и onSuccess вместо `scheduleRepeating. См. Также http://ejohn.org/blog/how-javascript-timers-work/

+0

SuperDevMode приятно. – Stefan

+0

Привет, Томас, спасибо за повторный обмен на оба моих билета, как-javascript-таймеры-работа/сайт очень детализированы и полезны. –

+0

Я буду реорганизовать код таймера и дать ему попробовать, интересно, что я был захвачен отчет кучи во время обычного выполнения GWT, компьютер остается в живых, но сохраняемый размер XMLHttpRequest медленно нарастает. –

Смежные вопросы