0

在 GWT 版本中找到:

GWT - 2.4.0

在操作系统/浏览器上遇到:

带有 IE9 的 Windows 7

详细说明(请尽可能具体):

离开 GWT App 运行过夜后发生 Out Of Heap 异常,使用 MemoryAnalyzer 进行诊断,发现崩溃时有 160 万个 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);
}

这是堆报告:

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

  • 感谢 10 名誉到发布图像规则
4

1 回答 1

3

它们不是RequestBuilder实例,而是匿名内部类的实例,它只能是底层XMLHttpRequestReadyStateChangeHandler.

鉴于您整晚都打开 DevMode 会话,您的计算机是否可以进入待机模式(抱歉,我不知道英文的确切术语)并关闭网络?
鉴于您似乎正在使用 IE,并且 IE 从未使请求超时,因此确实可能已发出请求但从未到达网络并且从未超时,因此这些类被保存在内存中。

只是一个想法。

我还敢打赌这只是 DevMode 和 IE 中的一个问题。
这是 DevMode 的一个非常不寻常的用法,所以我很难称它为错误。它也不值得修复,因为 GWT 团队正在开发一种新的SuperDevMode,它不再需要浏览器插件,而是始终将代码即时编译为 JS。


尝试从onFailureandonSuccess而不是使用 `scheduleRepeating 再次安排计时器。另请参阅http://ejohn.org/blog/how-javascript-timers-work/

于 2012-06-01T12:44:32.197 回答