3

gwt アプリケーションがあります。サーバーの日付をクライアント側に頻繁に表示する必要があります。このために、GWTEventServiceを使用しました。ユーザーがアプリケーションにログインしている間、1 つの rpc を送信し、クライアントに定期的にイベントを送信する 1 つのタイマーを作成します。

しかし、メモリ リークが原因で、JProfiler を使用してデバッグした後、timer 内で作成された日付オブジェクトがスレッドの作成のためにガベージ コレクションされていないことがわかりました。

また、デバッグ モードでスレッドを増やすイメージを 1 つ添付しました。

1)スレッド内で作成されたオブジェクトをガベージコレクションの対象にするにはどうすればよいですか?

2)サーバー時間をクライアントに送信する他の方法は何ですか?

3) JProfiler を使用して GWT War をテストするにはどうすればよいですか?

ハンドラー コード:

  public class UtilityCallerActionHandler extends RemoteEventServiceServlet implements
            ActionHandler<UtilityCaller, UtilityCallerResult> {

        private static Timer myEventGeneratorTimer;

        @Inject
        public UtilityCallerActionHandler() {
        }

        @Override
        public UtilityCallerResult execute(UtilityCaller action,
                ExecutionContext context) throws ActionException {
            try{
                if(myEventGeneratorTimer == null) {
                    myEventGeneratorTimer = new Timer(true);
                    myEventGeneratorTimer.schedule(new ServerTimerTask(), 0, 10000);
                }
                return new UtilityCallerResult();
            }catch (Exception e) {
                CommonUtil.printStackTrace(e);
                long exceptionBeanId = 0l;
                if (e instanceof NTException) {
                    exceptionBeanId = ((NTException)e).getExceptionBeanId();
                }
                throw new NTActionException(NTException.getStackTrace(e),e.getCause(), exceptionBeanId);
            }
        }

        @Override
        public void undo(UtilityCaller action, UtilityCallerResult result,
                ExecutionContext context) throws ActionException {
        }

        @Override
        public Class<UtilityCaller> getActionType() {
            return UtilityCaller.class;
        }

        private class ServerTimerTask extends TimerTask
        {
            public void run() {
                final Date theEventMessage = new Date();
                //create the event
                Event theEvent = new NTTimerEvent(theEventMessage);
                //add the event, so clients can receive it
                addEvent(NTTimerEvent.SERVER_MESSAGE_DOMAIN, theEvent);
            }
        }

    }

ここに画像の説明を入力

4

1 に答える 1