0

GWT リリースで見つかりました:

GWT-2.4.0

OS / ブラウザで発生:

Windows 7 と IE9

詳細な説明 (できるだけ具体的に記入してください):

GWT アプリを一晩実行するために残した後、ヒープ不足の例外が発生しました。MemoryAnalyzer を使用した診断では、クラッシュ時に com.google.gwt.http.client.RequestBuilder のインスタンスが 160 万個あり、各サイズが正確に 1208 バイトであることがわかりました。

さらに調べてみると、これらのリクエストはサーバーへの GWT Action 呼び出しであり、現在のサーバーのヘルス ステータスをポーリングするものであることがわかりました。1 秒ごとに com.google.gwt.user.client.Timer によるポーリング トリガー

問題を示す最短のコード スニペット:

@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);
}

ヒープ レポートは次のとおりです。

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

  • 評判から投稿までの 10 のルールをありがとう
4

1 に答える 1

3

それらはRequestBuilderインスタンスではなく、匿名の内部クラスのインスタンスであり、基になるXMLHttpRequestののみReadyStateChangeHandlerです。

DevMode セッションを一晩中開いたままにしておいた場合、コンピューターをスタンバイモード (英語での正確な用語はわかりません) にして、ネットワークをシャットダウンできたでしょうか?
IE を使用しているように見え、IE が要求をタイムアウトしない場合、実際には要求が行われたものの、ネットワークに到達せず、タイムアウトも発生しなかった可能性があるため、クラスはメモリに保持されます。

ただのアイデア。

また、これは DevMode と IE だけの問題だと思います。
これは DevMode の非常に珍しい使い方なので、バグとは言い難いでしょう。また、GWT チームは新しいSuperDevModeに取り組んでいるため、修正する価値はありません。これは、ブラウザー プラグインを必要としなくなり、その代わりに常にコードをオンザフライで JS にコンパイルします。


onFailure` scheduleRepeating onSuccess. http://ejohn.org/blog/how-javascript-timers-work/も参照してください。

于 2012-06-01T12:44:32.197 に答える