首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT内存泄漏链接到请求生成器(由GWTP操作服务器调用生成)

GWT内存泄漏链接到请求生成器(由GWTP操作服务器调用生成)
EN

Stack Overflow用户
提问于 2012-06-01 10:20:29
回答 1查看 532关注 0票数 0

在GWT发行版中找到:

GWT - 2.4.0

在OS /浏览器上遇到:

带有IE9的Windows 7

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

出堆异常发生后,左GWT在夜间运行,用MemoryAnalyzer诊断,发现崩溃时有160万个com.google.gwt.http.client.RequestBuilder实例,每个大小正好在1208字节。

进一步的检查显示,这些请求是对服务器的GWT操作调用,用于轮询当前服务器的运行状态。每1秒由com.google.gwt.user.client.Timer轮询触发器

演示问题的最短代码片段:

代码语言:javascript
复制
@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位声誉对后形象规则

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-01 12:44:32

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

考虑到您的DevMode会话整晚都处于打开状态,您的计算机是否已经进入待机模式(对不起,我不知道确切的英文术语)并关闭了网络吗?

考虑到您似乎在使用IE,而且IE从不超时请求,可能是请求已经发出,但从未到达网络,也从未超时,因此类被保存在内存中。

只是个主意。

我还敢打赌这只是DevMode和IE中的一个问题。

这是对DevMode的一种非常不寻常的使用,所以我几乎不称它为bug。它也不值得修复,因为GWT团队正在开发一个新的SuperDevMode,它将不再需要浏览器插件,而是始终将代码编译成JS,即时运行。

尝试从onFailureonSuccess重新调度计时器,而不是使用“`scheduleRepeating”。另见http://ejohn.org/blog/how-javascript-timers-work/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10848493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档